Pyqt5?Designer構(gòu)建桌面應(yīng)用設(shè)計(jì)及實(shí)現(xiàn)代碼
概要
文章分為三部分,主要是界面的設(shè)計(jì),py文件的代碼編寫(xiě)和其余部分的小修小補(bǔ)。
設(shè)計(jì)界面
執(zhí)行pip install pyqt5-tools
命令,安裝好可以在包目錄(類(lèi)似C:\Programs\Python\Python37-32\Lib\site-packages\pyqt5_tools
。)下找到designer.exe
應(yīng)用程序。
打開(kāi)后可以看到如下界面:
應(yīng)用界面
應(yīng)用的左邊是構(gòu)成用戶(hù)界面的各種組件,右邊是窗口以及組件的屬性和設(shè)置,中間就是你構(gòu)建用戶(hù)界面的窗口。
我們可以結(jié)合自己的需求,發(fā)揮想象力設(shè)計(jì)出獨(dú)特的用戶(hù)界面。
設(shè)計(jì)過(guò)程中,可以使用Ctrl+R
預(yù)覽界面。也可以初步體驗(yàn)一些交互功能。
我們?cè)诮缑嬗疫吙肯虏糠?,注意到?code>Signal/Slot Editor,我們可以在這里綁定一些事件。
例如我將spinBox
的valueChanged(int)
和progressBar
的setValue(int)
綁定,我們?cè)陬A(yù)覽界面的時(shí)候,不斷增加數(shù)值,可以看到進(jìn)度條也在同時(shí)改變。這些交互部分在生成代碼之后也有體現(xiàn)。
預(yù)覽
轉(zhuǎn)換為py代碼
設(shè)計(jì)好界面以后,我們需要轉(zhuǎn)換成python代碼,和我們的程序相結(jié)合,從單純的操作或命令行輸出,到用戶(hù)界面的誕生,我們還需要基于設(shè)計(jì)好的界面,再添磚加瓦。
轉(zhuǎn)換為python代碼是非常簡(jiǎn)單的,只需要在設(shè)計(jì)保存好的ui文件目錄下,執(zhí)行命令:
pyuic5 -o test.py test.ui
這里需要兩個(gè)參數(shù),第一個(gè)是轉(zhuǎn)換成py代碼的文件名,第二個(gè)是需要轉(zhuǎn)換成py文件的ui文件。
轉(zhuǎn)換好以后就可以通過(guò)代碼與設(shè)計(jì)好的界面相結(jié)合了。
直接生成好的文件,我們還需要在底部添加如下代碼才能運(yùn)行:
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)在我們只是需要以代碼的形式來(lái)生成用戶(hù)見(jiàn)面,不需要考慮太多。我個(gè)人認(rèn)為使用命令行生成的代碼并不美觀,因?yàn)橐陨仙傻拇a執(zhí)行過(guò)程中,需要給Ui_Form
類(lèi)的setupUi
方法傳遞QtWidgets.QMainWindow()
,其實(shí)更好的寫(xiě)法是繼承它而不是作為參數(shù)傳遞它,如果使用繼承,將代碼里的Form
直接更換為self
,更為合理一些。當(dāng)然現(xiàn)在不著急改這些。
組件交互
這里簡(jiǎn)單羅幾個(gè)我在使用過(guò)程中遇到的,組件需要和方法綁定的交互操作。
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è)計(jì)界面時(shí)的綁定操作,還是很好分析出每個(gè)組件具體有怎樣的屬性,以及如何綁定或改變。注意括號(hào)里都是方法名,名稱(chēng)尾部沒(méi)有括號(hào),因?yàn)槲覀冎皇菍⒎椒ê徒M件綁定在一起,當(dāng)組件發(fā)生改變時(shí)再調(diào)用方法。
補(bǔ)充
多線程的支持
我們?cè)O(shè)計(jì)好界面并和程序相結(jié)合,當(dāng)我們執(zhí)行的時(shí)候會(huì)發(fā)現(xiàn)點(diǎn)擊一個(gè)按鈕后,如果程序正在執(zhí)行,那么界面會(huì)呈現(xiàn)假死狀態(tài),是因?yàn)楝F(xiàn)在的程序還只支持單線程工作,就好比在開(kāi)發(fā)web界面的時(shí)候,如果設(shè)計(jì)到后臺(tái)發(fā)送郵件,如果不使用多線程或celery
隊(duì)列等方式,那么頁(yè)面也會(huì)呈現(xiàn)假死狀態(tài)。
官方提供了QtCore.QThread類(lèi),但是由于我的程序比較特殊,無(wú)法使用這種方法,所以另辟蹊徑,使用python自帶的threading
庫(kù)。
具體實(shí)現(xiàn)看以下代碼,需要根據(jù)實(shí)際情況自行修改:
# 導(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): """這部分是耗時(shí)操作""" ... self.main() # 調(diào)用創(chuàng)建線程的方法 self.pushButton.clicked.connect(self.thread_run)
簡(jiǎn)單來(lái)說(shuō)很簡(jiǎn)單,就是將具有耗時(shí)操作的方法,單獨(dú)用線程創(chuàng)建,按鈕綁定創(chuàng)建線程的方法即可。
但是在實(shí)際過(guò)程中我們會(huì)發(fā)現(xiàn)存在這樣一個(gè)問(wèn)題,在你關(guān)閉界面后,如果線程所在的任務(wù)沒(méi)有執(zhí)行完畢,線程還是會(huì)繼續(xù)執(zhí)行,這一般來(lái)說(shuō)不是我們想要的結(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è)置為守護(hù)線程,在主程序退出的時(shí)候同時(shí)結(jié)束任務(wù),無(wú)需等待子線程執(zhí)行完。
這樣以后我們?cè)陉P(guān)閉程序界面的時(shí)候,按鈕綁定的任務(wù)也會(huì)同時(shí)結(jié)束。
尚未調(diào)用 CoInitialize
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch) pywintypes.com_error: (-2147221008, '尚未調(diào)用 CoInitialize。', None, None)
因?yàn)槲业某绦蛑型瑫r(shí)使用了多線程和win32,所以引發(fā)了這個(gè)問(wèn)題。解決辦法也很簡(jiǎn)單。
import pythoncom
并在使用線程的地方加入一行:
pythoncom.CoInitialize()
例如上邊的例子就是在app_run
方法中添加一行
def app_run(self): """這部分是耗時(shí)操作""" pythoncom.CoInitialize() self.main()
這樣就不會(huì)報(bào)錯(cuò)了。
點(diǎn)擊按鈕彈出新窗口
需要我們?cè)僭O(shè)計(jì)一個(gè)界面。設(shè)計(jì)好后使用命令行轉(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_()
這樣下來(lái)一個(gè)簡(jiǎn)單的桌面應(yīng)用就搞定了。
具體可以參考陰陽(yáng)師桌面版助手[1]
引用鏈接
陰陽(yáng)師桌面版助手: https://github.com/alpha87/OnmyojiHelperGUI/releases
以上就是Pyqt5 Designer構(gòu)建桌面應(yīng)用的詳細(xì)內(nèi)容,更多關(guān)于Pyqt5 Designer構(gòu)建桌面應(yīng)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- PyQt5使用QtDesigner實(shí)現(xiàn)多界面切換程序的全過(guò)程
- PyQt5 designer 頁(yè)面點(diǎn)擊按鈕跳轉(zhuǎn)頁(yè)面實(shí)現(xiàn)
- PyQt5結(jié)合QtDesigner實(shí)現(xiàn)文本框讀寫(xiě)操作
- python3+PyQt5+Qt Designer實(shí)現(xiàn)界面可視化
- PyQT5速成教程之Qt Designer介紹與入門(mén)
- 解決安裝新版PyQt5、PyQT5-tool后打不開(kāi)并Designer.exe提示no Qt platform plugin的問(wèn)題
相關(guān)文章
TensorFlow獲取加載模型中的全部張量名稱(chēng)代碼
今天小編就為大家分享一篇TensorFlow獲取加載模型中的全部張量名稱(chēng)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02python,pycharm的環(huán)境變量設(shè)置方式
這篇文章主要介紹了python,pycharm的環(huán)境變量設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01詳解Python中的靜態(tài)方法與類(lèi)成員方法
這篇文章主要介紹了關(guān)于Python中靜態(tài)方法與類(lèi)成員的相關(guān)資料,文中通過(guò)示例代碼給大家詳細(xì)總結(jié)了兩者在語(yǔ)法和使用上的區(qū)別,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02python調(diào)用pyaudio使用麥克風(fēng)錄制wav聲音文件的教程
這篇文章主要介紹了python調(diào)用pyaudio使用麥克風(fēng)錄制wav聲音文件的教程,詳細(xì)的給大家介紹了pyaudio庫(kù)的安裝與使用,需要的朋友可以參考下2019-06-0633個(gè)Python爬蟲(chóng)項(xiàng)目實(shí)戰(zhàn)(推薦)
這篇文章主要介紹了33個(gè)Python爬蟲(chóng)項(xiàng)目實(shí)戰(zhàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-07-07Python實(shí)現(xiàn)購(gòu)物程序思路及代碼
本文給大家分享的是使用Python實(shí)現(xiàn)的購(gòu)物小程序的思路要求以及相關(guān)代碼,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下2017-07-07Python實(shí)現(xiàn)把類(lèi)當(dāng)做字典來(lái)訪問(wèn)
今天小編就為大家分享一篇Python實(shí)現(xiàn)把類(lèi)當(dāng)做字典來(lái)訪問(wèn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python常見(jiàn)庫(kù)matplotlib學(xué)習(xí)筆記之畫(huà)圖文字的中文顯示
在Python中使用matplotlib或者plotnine模塊繪圖時(shí),常常出現(xiàn)圖表中無(wú)法正常顯示中文的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Python常見(jiàn)庫(kù)matplotlib學(xué)習(xí)筆記之畫(huà)圖文字的中文顯示的相關(guān)資料,需要的朋友可以參考下2023-05-05