Pyqt5?Designer構(gòu)建桌面應(yīng)用設(shè)計及實現(xiàn)代碼
概要
文章分為三部分,主要是界面的設(shè)計,py文件的代碼編寫和其余部分的小修小補。
設(shè)計界面
執(zhí)行pip install pyqt5-tools命令,安裝好可以在包目錄(類似C:\Programs\Python\Python37-32\Lib\site-packages\pyqt5_tools。)下找到designer.exe應(yīng)用程序。
打開后可以看到如下界面:

應(yīng)用界面
應(yīng)用的左邊是構(gòu)成用戶界面的各種組件,右邊是窗口以及組件的屬性和設(shè)置,中間就是你構(gòu)建用戶界面的窗口。
我們可以結(jié)合自己的需求,發(fā)揮想象力設(shè)計出獨特的用戶界面。

設(shè)計過程中,可以使用Ctrl+R預(yù)覽界面。也可以初步體驗一些交互功能。
我們在界面右邊靠下部分,注意到有Signal/Slot Editor,我們可以在這里綁定一些事件。
例如我將spinBox的valueChanged(int)和progressBar的setValue(int)綁定,我們在預(yù)覽界面的時候,不斷增加數(shù)值,可以看到進度條也在同時改變。這些交互部分在生成代碼之后也有體現(xiàn)。
預(yù)覽

轉(zhuǎn)換為py代碼
設(shè)計好界面以后,我們需要轉(zhuǎn)換成python代碼,和我們的程序相結(jié)合,從單純的操作或命令行輸出,到用戶界面的誕生,我們還需要基于設(shè)計好的界面,再添磚加瓦。
轉(zhuǎn)換為python代碼是非常簡單的,只需要在設(shè)計保存好的ui文件目錄下,執(zhí)行命令:
pyuic5 -o test.py test.ui
這里需要兩個參數(shù),第一個是轉(zhuǎn)換成py代碼的文件名,第二個是需要轉(zhuǎn)換成py文件的ui文件。
轉(zhuǎn)換好以后就可以通過代碼與設(shè)計好的界面相結(jié)合了。
直接生成好的文件,我們還需要在底部添加如下代碼才能運行:
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_Form()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())現(xiàn)在我們只是需要以代碼的形式來生成用戶見面,不需要考慮太多。我個人認(rèn)為使用命令行生成的代碼并不美觀,因為以上生成的代碼執(zhí)行過程中,需要給Ui_Form類的setupUi方法傳遞QtWidgets.QMainWindow(),其實更好的寫法是繼承它而不是作為參數(shù)傳遞它,如果使用繼承,將代碼里的Form直接更換為self,更為合理一些。當(dāng)然現(xiàn)在不著急改這些。
組件交互
這里簡單羅幾個我在使用過程中遇到的,組件需要和方法綁定的交互操作。
pushButton
self.pushButton.clicked.connect(self.show_good_key)
spinBox
self.spinBox.valueChanged['int'].connect(self.set_num)
lineEdit
self.lineEdit.textChanged['QString'].connect(self.set_num)
結(jié)合設(shè)計界面時的綁定操作,還是很好分析出每個組件具體有怎樣的屬性,以及如何綁定或改變。注意括號里都是方法名,名稱尾部沒有括號,因為我們只是將方法和組件綁定在一起,當(dāng)組件發(fā)生改變時再調(diào)用方法。
補充
多線程的支持
我們設(shè)計好界面并和程序相結(jié)合,當(dāng)我們執(zhí)行的時候會發(fā)現(xiàn)點擊一個按鈕后,如果程序正在執(zhí)行,那么界面會呈現(xiàn)假死狀態(tài),是因為現(xiàn)在的程序還只支持單線程工作,就好比在開發(fā)web界面的時候,如果設(shè)計到后臺發(fā)送郵件,如果不使用多線程或celery隊列等方式,那么頁面也會呈現(xiàn)假死狀態(tài)。
官方提供了QtCore.QThread類,但是由于我的程序比較特殊,無法使用這種方法,所以另辟蹊徑,使用python自帶的threading庫。
具體實現(xiàn)看以下代碼,需要根據(jù)實際情況自行修改:
# 導(dǎo)入 Thread
from threading import Thread
def thread_run(self):
"""創(chuàng)建線程"""
thr = Thread(target=self.app_run)
thr.start()
def app_run(self):
"""這部分是耗時操作"""
...
self.main()
# 調(diào)用創(chuàng)建線程的方法
self.pushButton.clicked.connect(self.thread_run)簡單來說很簡單,就是將具有耗時操作的方法,單獨用線程創(chuàng)建,按鈕綁定創(chuàng)建線程的方法即可。
但是在實際過程中我們會發(fā)現(xiàn)存在這樣一個問題,在你關(guān)閉界面后,如果線程所在的任務(wù)沒有執(zhí)行完畢,線程還是會繼續(xù)執(zhí)行,這一般來說不是我們想要的結(jié)果,我們一般希望在關(guān)閉界面后,所有任務(wù)也一同結(jié)束。
所以需要在thread_run方法里添加一行:
def thread_run(self):
"""創(chuàng)建線程"""
thr = Thread(target=self.app_run)
thr.setDaemon(True)
thr.start()將子線程設(shè)置為守護線程,在主程序退出的時候同時結(jié)束任務(wù),無需等待子線程執(zhí)行完。
這樣以后我們在關(guān)閉程序界面的時候,按鈕綁定的任務(wù)也會同時結(jié)束。
尚未調(diào)用 CoInitialize
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch) pywintypes.com_error: (-2147221008, '尚未調(diào)用 CoInitialize。', None, None)
因為我的程序中同時使用了多線程和win32,所以引發(fā)了這個問題。解決辦法也很簡單。
import pythoncom
并在使用線程的地方加入一行:
pythoncom.CoInitialize()
例如上邊的例子就是在app_run方法中添加一行
def app_run(self):
"""這部分是耗時操作"""
pythoncom.CoInitialize()
self.main()這樣就不會報錯了。
點擊按鈕彈出新窗口
需要我們再設(shè)計一個界面。設(shè)計好后使用命令行轉(zhuǎn)換成py代碼。
然后在主界面中導(dǎo)入,并將該方法綁定需要彈出窗口的按鈕即可。
例如:
def show_good(self):
"""彈出窗口"""
from good import Ui_Form
ui = Ui_Form()
MainWindow = QtWidgets.QDialog()
ui.setupUi(MainWindow)
MainWindow.show()
MainWindow.exec_()這樣下來一個簡單的桌面應(yīng)用就搞定了。
具體可以參考陰陽師桌面版助手[1]
引用鏈接
陰陽師桌面版助手: https://github.com/alpha87/OnmyojiHelperGUI/releases
以上就是Pyqt5 Designer構(gòu)建桌面應(yīng)用的詳細(xì)內(nèi)容,更多關(guān)于Pyqt5 Designer構(gòu)建桌面應(yīng)用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python,pycharm的環(huán)境變量設(shè)置方式
這篇文章主要介紹了python,pycharm的環(huán)境變量設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
python調(diào)用pyaudio使用麥克風(fēng)錄制wav聲音文件的教程
這篇文章主要介紹了python調(diào)用pyaudio使用麥克風(fēng)錄制wav聲音文件的教程,詳細(xì)的給大家介紹了pyaudio庫的安裝與使用,需要的朋友可以參考下2019-06-06
Python常見庫matplotlib學(xué)習(xí)筆記之畫圖文字的中文顯示
在Python中使用matplotlib或者plotnine模塊繪圖時,常常出現(xiàn)圖表中無法正常顯示中文的問題,下面這篇文章主要給大家介紹了關(guān)于Python常見庫matplotlib學(xué)習(xí)筆記之畫圖文字的中文顯示的相關(guān)資料,需要的朋友可以參考下2023-05-05

