起步
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 QMainWindow
class 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 QIcon
class 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, QApplication
class 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, QApplication
class 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, QApplication
class 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 QIcon
class 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 QIcon
class 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, QApplication
class 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 == '': continue button = 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, QApplication
class 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, QLabel
class Example(QWidget):
def __init__(self): super().__init__()
self.initUI()
def initUI(self):
grid = QGridLayout() grid.setSpacing(10)
x = 0 y = 0
self.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, QApplication
class 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, QApplication
class 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 對話方塊(能夠輸入文字呦呦)
```python
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
QInputDialog, QApplication)import sys
class 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 sys
class 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 sys
class 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 sys
class 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 sys
class 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 sys
class 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 = 255 else: val = 0
if 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 滑塊是個好東西
```python
from PyQt5.QtWidgets import (QWidget, QSlider,
QLabel, QApplication)from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
import sys
class 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 sys
class 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 = 0
self.setGeometry(300, 300, 280, 170) self.setWindowTitle('進度條就比較強了')
self.show()
def timerEvent(self, e):
if self.step >= 200: self.timer.stop() self.btn.setText('完成吧')
return
self.step = self.step + 1 self.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 日曆
```python
from PyQt5.QtWidgets import (QWidget, QCalendarWidget,
QLabel, QApplication, QVBoxLayout)from PyQt5.QtCore import QDate
import sys
class 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 圖片
```python
from PyQt5.QtWidgets import (QWidget, QHBoxLayout,
QLabel, QApplication)from PyQt5.QtGui import QPixmap
import sys
class 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行編輯
```python
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 sys
class 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 sys
class 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 sys
class 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 拖放按鈕元件
```python
from PyQt5.QtWidgets import QPushButton, QWidget, QApplication
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDrag
import sys
class Button(QPushButton):
def __init__(self, title, parent): super().__init__(title, parent)
def mouseMoveEvent(self, e):
if e.buttons() != Qt.RightButton: return
mimeData = 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 Qt
class 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 點的繪畫
```python
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
import sys, random
class 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 顏色
```python
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QBrush
import sys
class 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是筆麼
```python
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt
import sys
class 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是啥?
```python
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QBrush
from PyQt5.QtCore import Qt
import sys
class 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的都知道)
```python
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPainterPath
from PyQt5.QtCore import Qt
import sys
class 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_())
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 sys
class Communicate(QObject):
updateBW = pyqtSignal(int)
class BurningWidget(QWidget):
def __init__(self): super().__init__()
self.initUI()
def initUI(self):
self.setMinimumSize(1, 30) self.value = 75 self.num = [75, 150, 225, 300, 375, 450, 525, 600, 675]
def setValue(self, value):
self.value = value
def paintEvent(self, e):
qp = QPainter() qp.begin(self) self.drawWidget(qp) qp.end()
def drawWidget(self, qp):
MAX_CAPACITY = 700 OVER_CAPACITY = 750
font = 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 = 0
for 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 + 1
class Example(QWidget):
def __init__(self): super().__init__()
self.initUI()
def initUI(self):
OVER_CAPACITY = 750
sld = 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_())```
終於翻到底部了,能看到這裡,給你自己一個獎勵吧!!!
```python
'''
┌─┐ ┌─┐ + + ┌──┘ ┴───────┘ ┴──┐++ │ │ │ ─── │++ + + + ███████───███████ │+ │ │+ │ ─┴─ │ │ │ └───┐ ┌───┘ │ │ │ │ + + │ │ │ └──────────────┐ │ │ │ ├─┐ │ ┌─┘ │ │ └─┐ ┐ ┌───────┬──┐ ┌──┘ + + + + │ ─┤ ─┤ │ ─┤ ─┤ └──┴──┘ └──┴──┘ + + + + 神獸保佑
程式碼無BUG!
'''
本作品採用《CC 協議》,轉載必須註明作者和本文連結