PyQt5案例匯總(完整版)

個人博客點這里

PyQt5案例匯總(完整版)

起步

PyQt5是一套綁定Qt5的應用程序框架。他在Python 2.x和3.x中都是可用的。該教程使用的是Python3.x。

Qt庫是一套最有用的GUI庫。

PyQt5是作為一套Python模塊實現的。他已經超過620個類和6000個函數與方法。他是一個運行在所有主流操作系統上的多平臺組件,包括Unix,Windows和Mac OS。

說明

下面小編就給大家提供一些簡單的pyqt5的案例,如有需要拿走不謝!!!

本文轉載from:PyQt5-Chinese-tutorial

菜單欄和工具欄

01窗口居中


# 導入需要的包和模塊
import sys
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QDesktopWidget
# QDesktopWidget這個庫提供了用戶的桌面信息,包括屏幕的大小
from PyQt5.QtWidgets import QApplication# 創建一個類
class Ex(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.resize(250,150)self.center()# 這個方法調用我們下面寫的,實現對話框居中的方法self.setWindowTitle('chuangkou要居中')self.show()def center(self):qr = self.frameGeometry()# 得到了主窗口大小print('qr:',qr)cp = QDesktopWidget().availableGeometry().center()# 獲取顯示器的分辨率,然后得到中間點的位置print('cp:',cp)qr.moveCenter(cp)# 然后把自己的窗口的中心點放到qr的中心點self.move(qr.topLeft())app = QApplication(sys.argv)
demo1 = Ex()
sys.exit(app.exec_())

02 狀態欄


# 導入需要的包和模塊
import sys
# from PyQt5.QtWidgets import QWidget
# from PyQt5.QtWidgets import QDesktopWidget
# QDesktopWidget這個庫提供了用戶的桌面信息,包括屏幕的大小
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QMainWindowclass Ex(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):# 狀態欄是由這個創建的self.statusBar().showMessage('準備')# 調用QtGui.QMainWindow 類的 statusBar()方法#3 創建狀態欄.第一次調用創建一個狀態欄,返回一個狀態欄對象.#3 showMessage()方法在狀態欄上顯示一條信息self.setGeometry(300,300,250,150)self.setWindowTitle('標題還是要取的')#顯示self.show()app = QApplication(sys.argv)
demo1 = Ex()
sys.exit(app.exec_())

03菜單欄


import sys
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QAction
from PyQt5.QtWidgets import qApp
from PyQt5.QtGui import QIconclass Ex(QMainWindow):def __init__(self):super(Ex, self).__init__()self.initUI()def initUI(self):exitAct = QAction(QIcon("exit.png"),'&Exit',self)print(exitAct)exitAct.setShortcut("ctrl+q")exitAct.setStatusTip('tuichu應用')exitAct.triggered.connect(qApp.quit)self.statusBar()menubar = self.menuBar()fileMenu = menubar.addMenu('&File')fileMenu.addAction(exitAct)self.setGeometry(300,300,399,200)self.setWindowTitle('決賽你電腦的')self.show()app = QApplication(sys.argv)
demo1 = Ex()
sys.exit(app.exec_())

04子菜單


import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplicationclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):menubar = self.menuBar()fileMenu = menubar.addMenu('File')impMenu = QMenu('Import', self)impAct = QAction('Import mail', self)impMenu.addAction(impAct)newAct = QAction('New', self)fileMenu.addAction(newAct)fileMenu.addMenu(impMenu)self.setGeometry(300, 300, 300, 200)self.setWindowTitle('Submenu')self.show()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

05 勾選菜單


import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QApplicationclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.statusbar = self.statusBar()self.statusbar.showMessage('Ready')menubar = self.menuBar()viewMenu = menubar.addMenu('View')# 本例創建了一個行為菜單。這個行為/動作能切換狀態欄顯示或者隱藏。viewStatAct = QAction('View statusbar', self, checkable=True)viewStatAct.setStatusTip('View statusbar')        # 用checkable選項創建一個能選中的菜單。viewStatAct.setChecked(True)        # 默認設置為選中狀態viewStatAct.triggered.connect(self.toggleMenu)viewMenu.addAction(viewStatAct)# 依據選中狀態切換狀態欄的顯示與否。self.setGeometry(300, 300, 300, 200)self.setWindowTitle('Check menu')self.show()def toggleMenu(self, state):if state:self.statusbar.show()else:self.statusbar.hide()app = QApplication(sys.argv)
demo1 = Example()
sys.exit(app.exec_())

06 右鍵菜單


import sys
from PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplicationclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 300, 200)self.setWindowTitle('Context menu')self.show()def contextMenuEvent(self, event):cmenu = QMenu(self)newAct = cmenu.addAction("New")print(newAct)opnAct = cmenu.addAction("Open")print(opnAct)quitAct = cmenu.addAction("Quit")action = cmenu.exec_(self.mapToGlobal(event.pos()))if action == quitAct:qApp.quit()elif action == opnAct:print('打開就打開')elif action == newAct:print('新建就新建')app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

07工具欄


# 菜單欄包含了所有的命令,工具欄就是常用的命令的集合。import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIconclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):exitAct = QAction(QIcon('logo.png'), 'Exit', self)exitAct.setShortcut('Ctrl+Q')exitAct.triggered.connect(qApp.quit)# 和上面的菜單欄差不多,這里使用了一個行為對象,# 這個對象綁定了一個標簽,一個圖標和一個快捷鍵。# 這些行為被觸發的時候,會調用QtGui.QMainWindow的quit方法退出應用。self.toolbar = self.addToolBar('Exit')self.toolbar.addAction(exitAct)self.setGeometry(300, 300, 300, 200)self.setWindowTitle('Toolbar')self.show()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
# 上面的例子中,我們創建了一個工具欄這個工具欄只有一個退出應用的動作

08主窗口(啥都有的呢)


# 本模塊的功能:<>
import sys
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QTextEdit
from PyQt5.QtWidgets import QAction
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QIconclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):textEdit = QTextEdit()self.setCentralWidget(textEdit)exitAct = QAction(QIcon('logo.png'), '退退退', self)exitAct.setShortcut('Ctrl+Q')exitAct.setStatusTip('退出應用')exitAct.triggered.connect(self.close)self.statusBar()menubar = self.menuBar()fileMenu = menubar.addMenu('文件')fileMenu.addAction(exitAct)toolbar = self.addToolBar('退出')toolbar.addAction(exitAct)self.setGeometry(300, 300, 350, 250)self.setWindowTitle('代碼編輯工具')self.show()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

布局管理

09絕對定位的應用


import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):lbl1 = QLabel('Zetcode', self)lbl1.move(15, 10)lbl2 = QLabel('tutorials', self)lbl2.move(35, 40)lbl3 = QLabel('for programmers', self)lbl3.move(55, 70)self.setGeometry(300, 300, 250, 150)self.setWindowTitle('Absolute')self.show()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())# 絕對定位其實說白了就是使用相對于原點的像素來進行計算

10 盒子布局


import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,QHBoxLayout, QVBoxLayout, QApplication)class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):okButton = QPushButton("OK")cancelButton = QPushButton("Cancel")hbox = QHBoxLayout()hbox.addStretch(1)hbox.addWidget(okButton)hbox.addWidget(cancelButton)vbox = QVBoxLayout()vbox.addStretch(1)vbox.addLayout(hbox)self.setLayout(vbox)self.setGeometry(300, 300, 300, 150)self.setWindowTitle('Buttons')self.show()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

11 柵格布局(表格)


import sys
from PyQt5.QtWidgets import (QWidget, QGridLayout,QPushButton, QApplication)class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):grid = QGridLayout()self.setLayout(grid)names = ['Cls', 'Bck', '', 'Close','7', '8', '9', '/','4', '5', '6', '*','1', '2', '3', '-','0', '.', '=', '+']positions = [(i,j) for i in range(5) for j in range(4)]for position, name in zip(positions, names):if name == '':continuebutton = QPushButton(name)grid.addWidget(button, *position)self.move(300, 150)self.setWindowTitle('Calculator')self.show()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

12 制作提交反饋信息的布局


import sys
from PyQt5.QtWidgets import \(QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication)class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):title = QLabel('Title')author = QLabel('Author')review = QLabel('Review')titleEdit = QLineEdit()authorEdit = QLineEdit()reviewEdit = QTextEdit()grid = QGridLayout()grid.setSpacing(10)grid.addWidget(title, 1, 0)grid.addWidget(titleEdit, 1, 1)grid.addWidget(author, 2, 0)grid.addWidget(authorEdit, 2, 1)grid.addWidget(review, 3, 0)grid.addWidget(reviewEdit, 3, 1, 5, 1)self.setLayout(grid)self.setGeometry(300, 300, 350, 300)self.setWindowTitle('Review')self.show()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

事件和信號

13 信號和槽機制


'''
事件
signals and slots 被其他人翻譯成信號和槽機制,(⊙o⊙)…我這里還是不翻譯好了。
所有的應用都是事件驅動的。事件大部分都是由用戶的行為產生的,當然也有其他的事件產生方式,
比如網絡的連接,窗口管理器或者定時器等。調用應用的exec_()方法時,應用會進入主循環,主循環會監聽和分發事件。
在事件模型中,有三個角色:
事件源
事件
事件目標
事件源就是發生了狀態改變的對象。事件是這個對象狀態改變的內容。
事件目標是事件想作用的目標。事件源綁定事件處理函數,然后作用于事件目標身上。
PyQt5處理事件方面有個signal and slot機制。Signals and slots用于對象間的通訊。
事件觸發的時候,發生一個signal,slot是用來被Python調用的
(相當于一個句柄?這個詞也好惡心,就是相當于事件的綁定函數)slot只有在事件觸發的時候才能調用。
'''import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import \(QWidget, QLCDNumber, QSlider, QVBoxLayout, QApplication)class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):lcd = QLCDNumber(self)print("lcd:",lcd)sld = QSlider(Qt.Horizontal, self)print("sld",sld)vbox = QVBoxLayout()print(vbox)vbox.addWidget(lcd)vbox.addWidget(sld)self.setLayout(vbox)print(lcd.display)sld.valueChanged.connect(lcd.display)self.setGeometry(300, 300, 250, 150)self.setWindowTitle('信號和槽機制的')self.show()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

14 重構事件處理器


import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 250, 150)self.setWindowTitle('事件的手')self.show()def keyPressEvent(self, e):if e.key() == Qt.Key_Escape:self.close()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

15 事件對像


import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QLabelclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):grid = QGridLayout()grid.setSpacing(10)x = 0y = 0self.text = "x: {0},  y: {1}".format(x, y)self.label = QLabel(self.text, self)grid.addWidget(self.label, 0, 0, Qt.AlignTop)self.setMouseTracking(True)self.setLayout(grid)self.setGeometry(300, 300, 350, 200)self.setWindowTitle('Event object')self.show()def mouseMoveEvent(self, e):x = e.x()y = e.y()text = "x: {0},  y: {1}".format(x, y)self.label.setText(text)app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

16事件發送


import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplicationclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):btn1 = QPushButton("按鈕老大", self)btn1.move(30, 50)btn2 = QPushButton("按鈕老二", self)btn2.move(150, 50)btn1.clicked.connect(self.buttonClicked)btn2.clicked.connect(self.buttonClicked)self.statusBar()self.setGeometry(300, 300, 290, 150)self.setWindowTitle('事件發送')self.show()def buttonClicked(self):sender = self.sender()self.statusBar().showMessage(sender.text() + '被按那兒了')app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

17 信號發送


import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplicationclass Communicate(QObject):closeApp = pyqtSignal()class Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.c = Communicate()self.c.closeApp.connect(self.close)self.setGeometry(300, 300, 290, 150)self.setWindowTitle('Emit signal')self.show()def mousePressEvent(self, event):self.c.closeApp.emit()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

對話框

18 對話框(能夠輸入文字呦呦)


from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,QInputDialog, QApplication)
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.btn = QPushButton('Dialog', self)self.btn.move(20, 20)self.btn.clicked.connect(self.showDialog)self.le = QLineEdit(self)self.le.move(130, 22)self.setGeometry(300, 300, 290, 150)self.setWindowTitle('Input dialog')self.show()def showDialog(self):text, ok = QInputDialog.getText(self, 'Input Dialog','Enter your name:')if ok:self.le.setText(str(text))print(text+"哈哈")app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

19 選取顏色(NB壞了)


# 本模塊的功能:<QColorDialog提供顏色的選擇>
# TODO 這個厲害,直接調用系統的顏色選擇框
# TODO 強,實在是強
from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame,QColorDialog, QApplication)
from PyQt5.QtGui import QColor
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):col = QColor(0, 0, 0)self.btn = QPushButton('Dialog', self)self.btn.move(20, 20)self.btn.clicked.connect(self.showDialog)self.frm = QFrame(self)self.frm.setStyleSheet("QWidget { background-color: %s }"% col.name())self.frm.setGeometry(130, 22, 100, 100)self.setGeometry(300, 300, 250, 180)self.setWindowTitle('Color dialog')self.show()def showDialog(self):col = QColorDialog.getColor()if col.isValid():self.frm.setStyleSheet("QWidget { background-color: %s }"% col.name())app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

加油,都看到一半了你!!!


'''┌─┐       ┌─┐ + +┌──┘ ┴───────┘ ┴──┐++│                 ││       ───       │++ + + +███████───███████ │+│                 │+│       ─┴─       ││                 │└───┐         ┌───┘│         ││         │   + +│         ││         └──────────────┐│                        ││                        ├─┐│                        ┌─┘│                        │└─┐  ┐  ┌───────┬──┐  ┌──┘  + + + +│ ─┤ ─┤       │ ─┤ ─┤└──┴──┘       └──┴──┘  + + + +神獸保佑代碼無BUG!'''

20 選擇字體


from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QPushButton,QSizePolicy, QLabel, QFontDialog, QApplication)
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):vbox = QVBoxLayout()btn = QPushButton('來來來', self)btn.setSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed)btn.move(20, 20)vbox.addWidget(btn)btn.clicked.connect(self.showDialog)self.lbl = QLabel('Knowledge only matters', self)self.lbl.move(130, 20)vbox.addWidget(self.lbl)self.setLayout(vbox)self.setGeometry(300, 300, 250, 180)self.setWindowTitle('字體目錄')self.show()def showDialog(self):font, ok = QFontDialog.getFont()if ok:self.lbl.setFont(font)print('選擇的字體是',end="")print(font)print(type(font))app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

21 選擇文件


from PyQt5.QtWidgets import \(QMainWindow, QTextEdit, QAction, QFileDialog, QApplication)
from PyQt5.QtGui import QIcon
import sysclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.textEdit = QTextEdit()self.setCentralWidget(self.textEdit)self.statusBar()openFile = QAction(QIcon('images/open.png'), 'Open', self)openFile.setShortcut('Ctrl+O')openFile.setStatusTip('打開一個新的文件')openFile.triggered.connect(self.showDialog)menubar = self.menuBar()fileMenu = menubar.addMenu('&文件')fileMenu.addAction(openFile)self.setGeometry(300, 300, 350, 300)self.setWindowTitle('File dialog')self.show()def showDialog(self):fname = QFileDialog.getOpenFileName(self, 'Open file', '/home')if fname[0]:f = open(fname[0], 'r')with f:data = f.read()self.textEdit.setText(data)print(data)
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

控件

22 QCheckBox是啥玩意


from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):cb = QCheckBox('改改改', self)cb.move(20, 20)cb.toggle()cb.stateChanged.connect(self.changeTitle)self.setGeometry(300, 300, 250, 150)self.setWindowTitle('真正的標題')self.show()def changeTitle(self, state):if state == Qt.Checked:self.setWindowTitle('假裝有標題')else:self.setWindowTitle('沒了')app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

23 切換按鈕


from PyQt5.QtWidgets import (QWidget, QPushButton,QFrame, QApplication)
from PyQt5.QtGui import QColor
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.col = QColor(0, 0, 0)redb = QPushButton('Red', self)redb.setCheckable(True)redb.move(10, 10)redb.clicked[bool].connect(self.setColor)greenb = QPushButton('Green', self)greenb.setCheckable(True)greenb.move(10, 60)greenb.clicked[bool].connect(self.setColor)blueb = QPushButton('Blue', self)blueb.setCheckable(True)blueb.move(10, 110)blueb.clicked[bool].connect(self.setColor)self.square = QFrame(self)self.square.setGeometry(150, 20, 100, 100)self.square.setStyleSheet("QWidget { background-color: %s }" %self.col.name())self.setGeometry(300, 300, 280, 170)self.setWindowTitle('Toggle button')self.show()def setColor(self, pressed):source = self.sender()if pressed:val = 255else:val = 0if source.text() == "Red":self.col.setRed(val)elif source.text() == "Green":self.col.setGreen(val)else:self.col.setBlue(val)self.square.setStyleSheet("QFrame { background-color: %s }" %self.col.name())if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

24 滑塊是個好東西


from PyQt5.QtWidgets import (QWidget, QSlider,QLabel, QApplication)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):sld = QSlider(Qt.Horizontal, self)sld.setFocusPolicy(Qt.NoFocus)sld.setGeometry(30, 40, 100, 30)sld.valueChanged[int].connect(self.changeValue)self.label = QLabel(self)self.label.setPixmap(QPixmap('images/logo.png'))self.label.setGeometry(160, 40, 80, 30)self.setGeometry(300, 300, 280, 170)self.setWindowTitle('s什么雞兒玩意r')self.show()def changeValue(self, value):if value == 0:self.label.setPixmap(QPixmap('images/1.png'))elif value > 0 and value <= 30:self.label.setPixmap(QPixmap('images/2.png'))elif value > 30 and value < 80:self.label.setPixmap(QPixmap('images/3.png'))else:self.label.setPixmap(QPixmap('images/4.png'))app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

25 進度條


from PyQt5.QtWidgets import (QWidget, QProgressBar,QPushButton, QApplication)
from PyQt5.QtCore import QBasicTimer
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.pbar = QProgressBar(self)self.pbar.setGeometry(30, 40, 200, 25)self.btn = QPushButton('走你', self)self.btn.move(40, 80)self.btn.clicked.connect(self.doAction)self.timer = QBasicTimer()self.step = 0self.setGeometry(300, 300, 280, 170)self.setWindowTitle('進度條就比較強了')self.show()def timerEvent(self, e):if self.step >= 200:self.timer.stop()self.btn.setText('完成吧')returnself.step = self.step + 1self.pbar.setValue(self.step)def doAction(self):if self.timer.isActive():self.timer.stop()self.btn.setText('走走走')else:self.timer.start(200, self)self.btn.setText('停,唄走了')if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

26 日歷


from PyQt5.QtWidgets import (QWidget, QCalendarWidget,QLabel, QApplication, QVBoxLayout)
from PyQt5.QtCore import QDate
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):vbox = QVBoxLayout(self)cal = QCalendarWidget(self)cal.setGridVisible(True)cal.clicked[QDate].connect(self.showDate)vbox.addWidget(cal)self.lbl = QLabel(self)date = cal.selectedDate()self.lbl.setText(date.toString())vbox.addWidget(self.lbl)self.setLayout(vbox)self.setGeometry(300, 300, 350, 300)self.setWindowTitle('看日歷,認準我')self.show()def showDate(self, date):self.lbl.setText(date.toString())if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

27 圖片


from PyQt5.QtWidgets import (QWidget, QHBoxLayout,QLabel, QApplication)
from PyQt5.QtGui import QPixmap
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):hbox = QHBoxLayout(self)pixmap = QPixmap("images/09f04")lbl = QLabel(self)lbl.setPixmap(pixmap)hbox.addWidget(lbl)self.setLayout(hbox)self.move(300, 200)self.setWindowTitle('Red Rock')self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

28行編輯


import sys
from PyQt5.QtWidgets import \(QWidget, QLabel, QLineEdit, QApplication)class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.lbl = QLabel(self)qle = QLineEdit(self)qle.move(60, 100)self.lbl.move(60, 40)qle.textChanged[str].connect(self.onChanged)self.setGeometry(300, 300, 280, 170)self.setWindowTitle('QLineEdit')self.show()def onChanged(self, text):self.lbl.setText(text)self.lbl.adjustSize()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

29 QSplitter是啥玩意呢?


from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QFrame,QSplitter, QStyleFactory, QApplication)
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):hbox = QHBoxLayout(self)topleft = QFrame(self)topleft.setFrameShape(QFrame.StyledPanel)topright = QFrame(self)topright.setFrameShape(QFrame.StyledPanel)bottom = QFrame(self)bottom.setFrameShape(QFrame.StyledPanel)splitter1 = QSplitter(Qt.Horizontal)splitter1.addWidget(topleft)splitter1.addWidget(topright)splitter2 = QSplitter(Qt.Vertical)splitter2.addWidget(splitter1)splitter2.addWidget(bottom)hbox.addWidget(splitter2)self.setLayout(hbox)self.setGeometry(300, 300, 400, 300)self.setWindowTitle('QSplitter')self.show()def onChanged(self, text):self.lbl.setText(text)self.lbl.adjustSize()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

30 下拉選框


from PyQt5.QtWidgets import (QWidget, QLabel,QComboBox, QApplication)
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.lbl = QLabel("Ubuntu", self)combo = QComboBox(self)combo.addItem("Ubuntu")combo.addItem("Windows")combo.addItem("centos")combo.addItem("deepin")combo.addItem("redhat")combo.addItem("debain")combo.move(50, 50)self.lbl.move(50, 150)combo.activated[str].connect(self.onActivated)self.setGeometry(300, 300, 300, 200)self.setWindowTitle('下拉選框練習 ')self.show()def onActivated(self, text):self.lbl.setText(text)self.lbl.adjustSize()app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

拖拽

31 簡單的拖放

from PyQt5.QtWidgets import (QPushButton, QWidget,QLineEdit, QApplication)
import sysclass Button(QPushButton):def __init__(self, title, parent):super().__init__(title, parent)self.setAcceptDrops(True)def dragEnterEvent(self, e):if e.mimeData().hasFormat('text/plain'):e.accept()else:e.ignore()def dropEvent(self, e):self.setText(e.mimeData().text())class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):edit = QLineEdit('', self)edit.setDragEnabled(True)edit.move(30, 65)button = Button("Button", self)button.move(190, 65)self.setWindowTitle('Simple drag and drop')self.setGeometry(300, 300, 300, 150)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()ex.show()app.exec_()

32 拖放按鈕組件


from PyQt5.QtWidgets import QPushButton, QWidget, QApplication
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDrag
import sysclass Button(QPushButton):def __init__(self, title, parent):super().__init__(title, parent)def mouseMoveEvent(self, e):if e.buttons() != Qt.RightButton:returnmimeData = QMimeData()drag = QDrag(self)drag.setMimeData(mimeData)drag.setHotSpot(e.pos() - self.rect().topLeft())dropAction = drag.exec_(Qt.MoveAction)def mousePressEvent(self, e):super().mousePressEvent(e)if e.button() == Qt.LeftButton:print('按我嘎哈')class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setAcceptDrops(True)self.button = Button('來吧!!!', self)self.button.move(100, 65)self.setWindowTitle('點擊還能挪')self.setGeometry(300, 300, 280, 150)def dragEnterEvent(self, e):e.accept()def dropEvent(self, e):position = e.pos()self.button.move(position)e.setDropAction(Qt.MoveAction)e.accept()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()ex.show()app.exec_()
"""
拖拽
在GUI里,拖放是指用戶點擊一個虛擬的對象,拖動,然后放置到另外一個對象上面的動作。
一般情況下,需要調用很多動作和方法,創建很多變量。
拖放能讓用戶很直觀的操作很復雜的邏輯。
一般情況下,我們可以拖放兩種東西:數據和圖形界面。
把一個圖像從一個應用拖放到另外一個應用上的實質是操作二進制數據。
把一個表格從Firefox上拖放到另外一個位置 的實質是操作一個圖形組。
"""

繪圖

33 文本的涂鴉(這個好玩哈)


import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QFont
from PyQt5.QtCore import Qtclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.text = "涂鴉要涂的有靈魂"self.setGeometry(300, 300, 280, 170)self.setWindowTitle('繪畫板')self.show()def paintEvent(self, event):qp = QPainter()qp.begin(self)self.drawText(event, qp,168, 34, 243)qp.end()# qp1 = QPainter()# qp1.begin(self)# self.drawText(event, qp1,168, 34, 23)# qp1.end()def drawText(self, event, qp, r,g,b):qp.setPen(QColor(r,g,b))qp.setFont(QFont('微軟雅黑', 15))qp.drawText(event.rect(), Qt.AlignCenter, self.text)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

34 點的繪畫


from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
import sys, randomclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 300, 190)self.setWindowTitle('一大堆點點兒')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawPoints(qp)qp.end()def drawPoints(self, qp):qp.setPen(Qt.red)size = self.size()for i in range(1000):x = random.randint(1, size.width()-1)y = random.randint(1, size.height()-1)qp.drawPoint(x, y)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

35 顏色


from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QBrush
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 350, 100)self.setWindowTitle('Colours')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawRectangles(qp)qp.end()def drawRectangles(self, qp):col = QColor(0, 0, 0)col.setNamedColor('#d4d4d4')qp.setPen(col)qp.setBrush(QColor(200, 0, 0))qp.drawRect(10, 15, 90, 60)qp.setBrush(QColor(255, 80, 0, 160))qp.drawRect(130, 15, 90, 60)qp.setBrush(QColor(25, 0, 90, 200))qp.drawRect(250, 15, 90, 60)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

36 QPen是筆么


from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 280, 270)self.setWindowTitle('Pen styles')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawLines(qp)qp.end()def drawLines(self, qp):pen = QPen(Qt.black, 2, Qt.SolidLine)qp.setPen(pen)qp.drawLine(20, 40, 250, 40)pen.setStyle(Qt.DashLine)qp.setPen(pen)qp.drawLine(20, 80, 250, 80)pen.setStyle(Qt.DashDotLine)qp.setPen(pen)qp.drawLine(20, 120, 250, 120)pen.setStyle(Qt.DotLine)qp.setPen(pen)qp.drawLine(20, 160, 250, 160)pen.setStyle(Qt.DashDotDotLine)qp.setPen(pen)qp.drawLine(20, 200, 250, 200)pen.setStyle(Qt.CustomDashLine)pen.setDashPattern([1, 4, 5, 4])qp.setPen(pen)qp.drawLine(20, 240, 250, 240)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

37 QBrush是啥?


from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QBrush
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 355, 280)self.setWindowTitle('Brushes')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawBrushes(qp)qp.end()def drawBrushes(self, qp):brush = QBrush(Qt.SolidPattern)qp.setBrush(brush)qp.drawRect(10, 15, 90, 60)brush.setStyle(Qt.Dense1Pattern)qp.setBrush(brush)qp.drawRect(130, 15, 90, 60)brush.setStyle(Qt.Dense2Pattern)qp.setBrush(brush)qp.drawRect(250, 15, 90, 60)brush.setStyle(Qt.DiagCrossPattern)qp.setBrush(brush)qp.drawRect(10, 105, 90, 60)brush.setStyle(Qt.Dense5Pattern)qp.setBrush(brush)qp.drawRect(130, 105, 90, 60)brush.setStyle(Qt.Dense6Pattern)qp.setBrush(brush)qp.drawRect(250, 105, 90, 60)brush.setStyle(Qt.HorPattern)qp.setBrush(brush)qp.drawRect(10, 195, 90, 60)brush.setStyle(Qt.VerPattern)qp.setBrush(brush)qp.drawRect(130, 195, 90, 60)brush.setStyle(Qt.BDiagPattern)qp.setBrush(brush)qp.drawRect(250, 195, 90, 60)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

38 貝賽爾曲線(這個學過PS的都知道)


from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPainterPath
from PyQt5.QtCore import Qt
import sysclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 用QPainterPath路徑創建貝塞爾曲線。# 使用cubicTo()方法生成,分別需要三個點:起始點,控制點和終止點。self.setGeometry(300, 300, 380, 250)self.setWindowTitle('繪制貝塞爾曲線')self.show()def paintEvent(self, e):qp = QPainter()qp.begin(self)qp.setRenderHint(QPainter.Antialiasing)self.drawBezierCurve(qp)qp.end()def drawBezierCurve(self, qp):path = QPainterPath()path.moveTo(30, 30)path.cubicTo(30, 30, 350, 30, 200, 150)qp.drawPath(path)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

自定義組件

39


from PyQt5.QtWidgets import (QWidget, QSlider, QApplication,QHBoxLayout, QVBoxLayout)
from PyQt5.QtCore import QObject, Qt, pyqtSignal
from PyQt5.QtGui import QPainter, QFont, QColor, QPen
import sysclass Communicate(QObject):updateBW = pyqtSignal(int)class BurningWidget(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setMinimumSize(1, 30)self.value = 75self.num = [75, 150, 225, 300, 375, 450, 525, 600, 675]def setValue(self, value):self.value = valuedef paintEvent(self, e):qp = QPainter()qp.begin(self)self.drawWidget(qp)qp.end()def drawWidget(self, qp):MAX_CAPACITY = 700OVER_CAPACITY = 750font = QFont('Serif', 7, QFont.Light)qp.setFont(font)size = self.size()w = size.width()h = size.height()step = int(round(w / 10))till = int(((w / OVER_CAPACITY) * self.value))full = int(((w / OVER_CAPACITY) * MAX_CAPACITY))if self.value >= MAX_CAPACITY:qp.setPen(QColor(255, 255, 255))qp.setBrush(QColor(255, 255, 184))qp.drawRect(0, 0, full, h)qp.setPen(QColor(255, 175, 175))qp.setBrush(QColor(255, 175, 175))qp.drawRect(full, 0, till-full, h)else:qp.setPen(QColor(255, 255, 255))qp.setBrush(QColor(255, 255, 184))qp.drawRect(0, 0, till, h)pen = QPen(QColor(20, 20, 20), 1,Qt.SolidLine)qp.setPen(pen)qp.setBrush(Qt.NoBrush)qp.drawRect(0, 0, w-1, h-1)j = 0for i in range(step, 10*step, step):qp.drawLine(i, 0, i, 5)metrics = qp.fontMetrics()fw = metrics.width(str(self.num[j]))qp.drawText(i-fw/2, h/2, str(self.num[j]))j = j + 1class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):OVER_CAPACITY = 750sld = QSlider(Qt.Horizontal, self)sld.setFocusPolicy(Qt.NoFocus)sld.setRange(1, OVER_CAPACITY)sld.setValue(75)sld.setGeometry(30, 40, 150, 30)self.c = Communicate()self.wid = BurningWidget()self.c.updateBW[int].connect(self.wid.setValue)sld.valueChanged[int].connect(self.changeValue)hbox = QHBoxLayout()hbox.addWidget(self.wid)vbox = QVBoxLayout()vbox.addStretch(1)vbox.addLayout(hbox)self.setLayout(vbox)self.setGeometry(300, 300, 390, 210)self.setWindowTitle('Burning widget')self.show()def changeValue(self, value):self.c.updateBW.emit(value)self.wid.repaint()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

終于翻到底部了,能看到這里,給你自己一個獎勵吧!!!


'''┌─┐       ┌─┐ + +┌──┘ ┴───────┘ ┴──┐++│                 ││       ───       │++ + + +███████───███████ │+│                 │+│       ─┴─       ││                 │└───┐         ┌───┘│         ││         │   + +│         ││         └──────────────┐│                        ││                        ├─┐│                        ┌─┘│                        │└─┐  ┐  ┌───────┬──┐  ┌──┘  + + + +│ ─┤ ─┤       │ ─┤ ─┤└──┴──┘       └──┴──┘  + + + +神獸保佑代碼無BUG!'''

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454990.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454990.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中的 隱藏鼠標菜單_Mac移動隱藏刪除頂部菜單欄圖標教程

蘋果菜單欄貫穿 Mac 的屏幕頂部。左側是蘋果菜單和應用菜單&#xff0c;應用菜單一般顯示你當前使用的Mac軟件的所有功能菜單。右側通常是以圖標顯示的狀態菜單&#xff0c;幫助你快速查看Mac的狀態以及快速訪問某些Mac軟件。移動圖標位置若想要重新排列狀態菜單欄的圖標&#…

可以用什么代替平面鏡

答案是鏡面 潛望鏡是利用平面鏡來改變光路轉載于:https://www.cnblogs.com/lidepeng/p/7280593.html

[hadoop] kettle spoon 基礎使用 (txt 內容抽取到excel中)

spoon.bat 啟動kettle。 測試數據 1. 新建轉換 輸入中選擇文本文件輸入 雙擊設置文本輸入 字符集、分隔符設置 獲取對應的字段&#xff0c;預覽記錄。 拖入 excel輸出&#xff0c;設置轉換關系 設置輸出路徑 獲取字段 啟動轉換 導入的excel數據&#xff08;設置好格式,圖中ID,A…

ffmpeg提取音頻播放器總結

ffmpeg提取音頻播放器總結&#xff1b; 一&#xff1a;簡介 從編寫音頻播放器代碼到完成播放器編寫&#xff0c;測試&#xff0c;整整5天的時間&#xff0c;這時間還不算之前對 ffmpeg熟悉的時間&#xff0c;可以說是歷經千辛萬苦&#xff0c;終于搞出來了&#xff0c;雖然最…

【BZOJ 4103】 [Thu Summer Camp 2015]異或運算 可持久化01Trie

我們觀察數據&#xff1a;樹套樹 PASS 主席樹 PASS 一層一個Trie PASS 再看&#xff0c;異或&#xff01;我們就把目光暫時定在01Tire然后我們發現&#xff0c;我們可以帶著一堆點在01Trie上行走&#xff0c;因為O(n*q*30m*30)是一個可選復雜度。 我們想一下我們正常的時候…

Docker學習筆記——Java及Tomcat Dockerfile

1、Java Dockerfile創建項目目錄java&#xff0c;目錄下上傳所需java版本壓縮包&#xff0c;并創建Dockerfile文件&#xff0c;項目結構如下&#xff1a;java-Dockerfile-jdk-8u111-linux-x64.gzDockerfile內容&#xff1a;# JAVA # Version 1.8.0_111 # SOURCE_IMAGE FROM cen…

rabbitmq接口異常函數方法_RabbitMQ監控(三):監控隊列狀態

#RabbitMQ 監控(三)驗證RabbitMQ健康運行只是確保消息通信架構可靠性的一部分&#xff0c;同時&#xff0c;你也需要確保消息通信結構配置沒有遭受意外修改&#xff0c;從而避免應用消息丟失。RabbitMQ Management HTTP API提供了一個方法允許你查看任何vhost上的任何隊列&…

FFMpeg語法參數中文參考手冊

要查看你的ff mpeg支持哪些 格式&#xff0c;可以用如下命令&#xff1a;$ ffmpeg -formats | less還可以把 視頻文件導出成jpg序列幀&#xff1a;$ ffmpeg -i bc-cinematic-en.avi example.%d.jpgdebian下安裝ffmpeg很簡單&#xff1a;&#xff03;apt-get install ffmpegffmp…

Java類集框架 —— LinkedHashMap源碼分析

前言 我們知道HashMap底層是采用數組單向線性鏈表/紅黑樹來實現的&#xff0c;HashMap在擴容或者鏈表與紅黑樹轉換過程時可能會改變元素的位置和順序。如果需要保存元素存入或訪問的先后順序&#xff0c;那就需要采用LinkedHashMap了。 LinkedHashMap結構 LinkedHashMap繼承自H…

apache 支持.htaccess重寫url

1. httpd.conf 添加&#xff1a; <Directory />Options Indexes FollowSymLinks MultiviewsAllowOverride allRequire all grantedRewriteEngine On</Directory> 開啟&#xff1a; 在phpinfo里找到&#xff1a; 說明開啟成功。 2.httpd-vhosts.conf &#xff08;開…

oom 如何避免 高并發_【高并發】高并發環境下如何防止Tomcat內存溢出?看完我懂了!!...

【高并發】高并發環境下如何防止Tomcat內存溢出&#xff1f;看完我懂了&#xff01;&#xff01;發布時間&#xff1a;2020-04-19 00:47,瀏覽次數&#xff1a;126, 標簽&#xff1a;Tomcat寫在前面隨著系統并發量越來越高&#xff0c;Tomcat所占用的內存就會越來越大&#xff0…

[JSOI2008]最小生成樹計數

OJ題號&#xff1a;  BZOJ1016 題目大意&#xff1a;   給定一個無向帶權圖&#xff0c;求最小生成樹的個數。 思路&#xff1a;   先跑一遍最小生成樹&#xff0c;統計相同權值的邊出現的個數。   易證不同的最小生成樹&#xff0c;它們不同的那一部分邊的權值實際上是…

vuex webpack 配置_vue+webpack切換環境和打包之后服務器配置

import axios from ‘axios‘import store from ‘../store/index‘const rootUrl process.env.API_ROOT//創建axios實例const service axios.create({timeout:30000 //超時時間})//添加request攔截器service.interceptors.request.use(config >{if (Object.keys(config.hea…

redis基本用法學習(C#調用FreeRedis操作redis)

FreeRedis屬于常用的基于.net的redis客戶端&#xff0c;EasyCaching中也提供適配FreeRedis的包。根據參考文獻4中的說法&#xff0c;FreeRedis和CsRedis算是近親&#xff08;都是GitHub中賬號為2881099下的開源項目&#xff09;&#xff0c;因此其用法特別相似。FreeRedis的主要…

opencv:圖像的基本變換

0.概述 圖像變換的基本原理都是找到原圖和目標圖的像素位置的映射關系&#xff0c;這個可以用坐標系來思考&#xff0c;在opencv中&#xff0c; 圖像的坐標系是從左上角開始(0,0)&#xff0c;向右是x增加方向(cols)&#xff0c;向下時y增加方向(rows)。 普通坐標關系&#xff1…

FFMpeg在Windows環境下的編譯

1&#xff0e;安裝MinGW &#xff08;1&#xff09;下載文件&#xff1a;MinGW-5.1.4.exe&#xff0c; &#xff08;2&#xff09;安裝時選擇下列組件&#xff1a; binutils-2.19.1-mingw32-bin.tar.gz gcc-core-3.4.5-20060117-3.tar.gz gcc-g-3.4.5-20060117-3.tar.gz …

中通知設置響鈴_主動切斷干擾源——手機“通知”精細化管理

上周去參加我福福幼兒園的母親節活動&#xff0c;內容是孩子和家長一起穿手鏈。期間我發現和我同桌的一個家長的手機不停在響&#xff0c;當然伴隨著注意力被打斷。不僅是這位家長自己&#xff0c;連我也受到了干擾。于是職業病又犯了&#xff0c;我悄悄的看了一眼這位家長的手…

OCM_第十九天課程:Section9 —》Data Guard _ DATA GUARD 原理/DATA GUARD 應用/DATA GUARD 搭建...

注&#xff1a;本文為原著&#xff08;其內容來自 騰科教育培訓課堂&#xff09;。閱讀本文注意事項如下&#xff1a;1&#xff1a;所有文章的轉載請標注本文出處。2&#xff1a;本文非本人不得用于商業用途。違者將承當相應法律責任。3&#xff1a;該系列文章目錄列表&#xf…

python安裝各種插件

http://www.lfd.uci.edu/~gohlke/pythonlibs/#pip 感受&#xff1a;如果編輯pip真的一直出問題&#xff0c;考慮降成32位的進行安裝。畢竟合理搭配比木桶突出有用。轉載于:https://www.cnblogs.com/osmondwang/p/7307678.html

編寫數學公式的好工具

2019獨角獸企業重金招聘Python工程師標準>>> http://private.codecogs.com/latex/eqneditor.php 轉載于:https://my.oschina.net/yizhichao/blog/1542153