以下內(nèi)容翻譯自https://build-system.fman.io/pyqt5-tutorial,有刪減兵志。
我們先看下面一個(gè)簡(jiǎn)單的GUI代碼:
from PyQt5.QtWidgets import QApplication, QLabel
app = QApplication([])
label = QLabel('Hello World!')
label.show()
app.exec_()
第一行是導(dǎo)入相關(guān)的QT相關(guān)的庫(kù)固阁。
接著第二行是通過創(chuàng)建了一個(gè)QApplication
:
app = QApplication([])
這是必須要?jiǎng)?chuàng)建的一個(gè)對(duì)象芝发。每個(gè)GUI程序都必須有且只有一個(gè)QApplication的實(shí)例泼诱。如果沒有這個(gè)實(shí)例的話,我們寫的QT是沒法執(zhí)行的咪奖,所以我們寫QT代碼的時(shí)候一定不要忘了創(chuàng)建這個(gè)對(duì)象盗忱。 創(chuàng)建這個(gè)對(duì)象時(shí)需要傳遞一個(gè)list參數(shù),因?yàn)槲覀兊腉UI不需要什么參數(shù)赡艰,所以直接傳遞了一個(gè)[]
售淡。
在創(chuàng)建了app之后,我們又創(chuàng)建了一個(gè)Label(標(biāo)簽):
label = QLabel('Hello World!')
傳遞的參數(shù)就是標(biāo)簽顯示的內(nèi)容慷垮,然后通過調(diào)用show()
方法讓它在屏幕上顯示揖闸。
最后的一行代碼是告訴qt一直運(yùn)行下去,直到有人關(guān)閉它料身。
完成上述工作之后,執(zhí)行代碼汤纸,我們的一個(gè)小小窗口就會(huì)顯示在屏幕上:
Widgets
我們?cè)赒t程序中看到的每個(gè)東西都可以稱之為一個(gè)widget:按鈕,標(biāo)簽芹血,窗口贮泞,對(duì)話框楞慈,程序的進(jìn)度條等等。與HTML元素類似啃擦,widget一般也都是嵌入式的囊蓝。舉個(gè)例子,一個(gè)窗口包含了一個(gè)按鈕令蛉,同時(shí)也可能包含了一個(gè)標(biāo)簽聚霜。
下面的截圖展示了QT中常用的widget。
從上到下珠叔,從左到右蝎宇,這些widget依次是:
Layouts
正如上面的截圖所示,我們的GUI中可能包含了多個(gè)widgets祷安。在這種情況下姥芥,我們需要告訴QT如何安放這些widgets。例如汇鞭。我們可以使用QVBoxLayout
垂直堆放widget:
這個(gè)截圖的代碼如下:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
layout.addWidget(QPushButton('Top'))
layout.addWidget(QPushButton('Bottom'))
window.setLayout(layout)
window.show()
app.exec_()
一如既往凉唐,我們還是先創(chuàng)建了一個(gè)QApplication
。接著我們創(chuàng)建了一個(gè)window
虱咧。我們使用的是最基本的QWdiget
熊榛,因?yàn)樗皇且粋€(gè)容器,用來放置widget腕巡,我們并不需要它有什么特殊的功能。然后血筑,我們就創(chuàng)建了一個(gè)layout
,還創(chuàng)建了兩個(gè)QPushButton
放在里面绘沉。最后,我們告訴了window豺总,我們需要使用這個(gè)layout车伞。然后就跟我們的第一個(gè)GUI一樣,調(diào)用show()
和exec_()
喻喳。
當(dāng)然還有很多其他的layout另玖,例如QHBoxLayOut等等。更多的風(fēng)格表伦,可以在qt的網(wǎng)站上查閱
自定義風(fēng)格
QT一個(gè)比較強(qiáng)大的地方就是它支持自定義的用戶風(fēng)格谦去。
風(fēng)格設(shè)置
比較直接的設(shè)置方式就是在我們的程序中直接指定全局的風(fēng)格。我們?cè)倏纯粗暗慕貓D:
上面的這個(gè)窗口風(fēng)格稱之為Flusion
蹦哼,我們也可以把他替換成Windows
風(fēng)格:
通過qpp.setStyle(...)
方法鳄哭,我們就可以設(shè)置自己的風(fēng)格了。
from PyQt5.QtWidgets import *
app = QApplication([])
app.setStyle('Fusion')
...
具體支持什么樣的風(fēng)格依賴于我們使用的操作系統(tǒng)纲熏,但是一般都支持以下的風(fēng)格:'Fusion'
, 'Windows'
, 'WindowsVista'
(僅Windows支持) and 'Macintosh'
(僅Mac支持)
自定義顏色
如果我們喜歡一種風(fēng)格妆丘,但是我們想改變一些顏色锄俄。那么我們就可以使用QPalette來實(shí)現(xiàn)我們的功能。例如:
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QApplication, QPushButton
app = QApplication([])
app.setStyle('Fusion')
palette = QPalette()
palette.setColor(QPalette.ButtonText, Qt.red)
app.setPalette(palette)
button = QPushButton('Hello World')
button.show()
app.exec_()
執(zhí)行效果如下:
面板風(fēng)格
除了上述的功能之外勺拣,我們還可以通過面板風(fēng)格來改變我們程序的外觀奶赠。這就是QT類似于CSS的特性。我們可以通過以下的方法我們的面板添加一些空間:
from PyQt5.QtWidgets import QApplication, QPushButton
app = QApplication([])
app.setStyleSheet("QPushButton { margin: 10ex; }")
button = QPushButton('Hello World')
button.show()
app.exec_()
更多關(guān)于面板風(fēng)格的信息药有,可以查看qt官網(wǎng)毅戈。
Signals / slots
QT 通過Signals
(信號(hào))機(jī)制來讓我們對(duì)一些事件做響應(yīng),例如我們點(diǎn)擊了一個(gè)按鈕塑猖。下面的這個(gè)例子就是當(dāng)我們點(diǎn)擊按鈕時(shí)竹祷,會(huì)彈出對(duì)話框。
from PyQt5.QtWidgets import *
app = QApplication([])
button = QPushButton('Click')
def on_button_clicked():
alert = QMessageBox()
alert.setText('You clicked the button!')
alert.exec_()
button.clicked.connect(on_button_clicked)
button.show()
app.exec_()
button.clicked
這就是個(gè)signal(信號(hào))羊苟,.connect(...)
就是我們指定的與這個(gè)signal關(guān)聯(lián)的slot(槽)
塑陵。上面這是一個(gè)簡(jiǎn)單的響應(yīng)函數(shù),當(dāng)我們點(diǎn)擊這個(gè)按鈕的時(shí)候蜡励,這個(gè)動(dòng)作(函數(shù))就會(huì)觸發(fā)令花。
Signals在QT中是無處不在的,用戶也可以定義自己的signal凉倚。
編譯屬于自己的APP
現(xiàn)在我們已經(jīng)有了一點(diǎn)關(guān)于GUI的基本知識(shí)了兼都。但是當(dāng)我們寫好一個(gè)程序之后,如何給別人使用呢稽寒?讓別人搭建環(huán)境扮碧,然后再把腳本給人家嗎?這肯定是不合理的杏糙,所以我們?cè)撛趺醋瞿兀?/p>
在python的世界中慎王,將源碼轉(zhuǎn)換成一個(gè)可執(zhí)行的包
,這種操作稱之為freezing
。盡管現(xiàn)在已經(jīng)有很多的庫(kù)都可以解決這個(gè)問題宏侍,例如:PyInstaller 赖淤,py2exe,cx_Freeze,bbfreze,py2app...但是這些傳統(tǒng)的庫(kù)用來freezing一個(gè)PyQt程序還是有點(diǎn)難度的谅河。
這里我們使用一個(gè)全新的fbs
庫(kù)咱旱,它可以讓我們輕易的將python源碼轉(zhuǎn)換成一個(gè)執(zhí)行的PyQt程序。安裝fbs
也很簡(jiǎn)單绷耍,執(zhí)行下面的命令就OK了:
pip install fbs
接著執(zhí)行:
fbs startproject
然后你就會(huì)看到下面的提示:
當(dāng)你輸入run
之后吐限,就會(huì)打開一個(gè)空的窗口:
這就跟我們之前創(chuàng)建的一個(gè)qt程序相似。它會(huì)在我們的當(dāng)前目錄下創(chuàng)建一個(gè)文件src/main/python/main.py
,然后我們可以試著把它編程一個(gè)可執(zhí)行的文件锨天。
fbs freeze
這個(gè)命令就在你當(dāng)前的目錄的target/MyApp/
子目錄有了一個(gè)可執(zhí)行的文件毯盈。然后我們就可以把它發(fā)送給別人了。
(注意:fbs現(xiàn)在支持Python 3.5 或者 3.6病袄,如果你的版本不是二者之一搂赋,同時(shí)你的fbs還出現(xiàn)了問題赘阀,建議你安裝Python 3.6再試試。)
小獎(jiǎng)勵(lì)![img]:創(chuàng)建一個(gè)安裝包
通過fbs installer
命令我們還可以創(chuàng)建安裝包脑奠。
(如果你使用的Windows系統(tǒng)基公,那么你需要先安裝NSIS,然后配置好環(huán)境變量)
線面的一篇文章說明了如何使用fbs
宋欺,另外你也可以看看fbs教程