Python QT5 簡(jiǎn)潔入門

以下內(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ì)顯示在屏幕上:

QVBoxLayout example

Widgets

我們?cè)赒t程序中看到的每個(gè)東西都可以稱之為一個(gè)widget:按鈕,標(biāo)簽芹血,窗口贮泞,對(duì)話框楞慈,程序的進(jìn)度條等等。與HTML元素類似啃擦,widget一般也都是嵌入式的囊蓝。舉個(gè)例子,一個(gè)窗口包含了一個(gè)按鈕令蛉,同時(shí)也可能包含了一個(gè)標(biāo)簽聚霜。

下面的截圖展示了QT中常用的widget。

Screenshot of common Qt widgets using the Fusion style

從上到下珠叔,從左到右蝎宇,這些widget依次是:

Layouts

正如上面的截圖所示,我們的GUI中可能包含了多個(gè)widgets祷安。在這種情況下姥芥,我們需要告訴QT如何安放這些widgets。例如汇鞭。我們可以使用QVBoxLayout垂直堆放widget:

QVBoxLayout example

這個(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:

Screenshot of common Qt widgets using the Fusion style

上面的這個(gè)窗口風(fēng)格稱之為Flusion蹦哼,我們也可以把他替換成Windows風(fēng)格:

Screenshot of common Qt widgets using the Windows style

通過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í)行效果如下:

Screenshot of a QPushButton with red text in the Fusion style

面板風(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_()
Qt window with a button surrounded by extra space

更多關(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_()
PyQt QMessageBox saying that a button was clicked

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ì)看到下面的提示:

Commands for starting a new project with fbs

當(dāng)你輸入run之后吐限,就會(huì)打開一個(gè)空的窗口:

An empty window showing 'Hello World!' in its title

這就跟我們之前創(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)建安裝包脑奠。

img
img

(如果你使用的Windows系統(tǒng)基公,那么你需要先安裝NSIS,然后配置好環(huán)境變量)

線面的一篇文章說明了如何使用fbs宋欺,另外你也可以看看fbs教程

文章

fbs 教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轰豆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子齿诞,更是在濱河造成了極大的恐慌酸休,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祷杈,死亡現(xiàn)場(chǎng)離奇詭異斑司,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)但汞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門宿刮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人私蕾,你說我怎么就攤上這事僵缺。” “怎么了踩叭?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵磕潮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我容贝,道長(zhǎng)揉抵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任嗤疯,我火速辦了婚禮,結(jié)果婚禮上闺兢,老公的妹妹穿的比我還像新娘茂缚。我一直安慰自己,他們只是感情好屋谭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布脚囊。 她就那樣靜靜地躺著,像睡著了一般桐磁。 火紅的嫁衣襯著肌膚如雪悔耘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天我擂,我揣著相機(jī)與錄音衬以,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛败晴,可吹牛的內(nèi)容都是我干的未桥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼互妓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼溪窒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冯勉,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤澈蚌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后灼狰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宛瞄,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年伏嗜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坛悉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡承绸,死狀恐怖裸影,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情军熏,我是刑警寧澤轩猩,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站荡澎,受9級(jí)特大地震影響均践,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摩幔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一彤委、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧或衡,春花似錦焦影、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坡疼,卻和暖如春彬呻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工闸氮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剪况,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓湖苞,卻偏偏與公主長(zhǎng)得像拯欧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子财骨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容