欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pyqt5?Designer構建桌面應用設計及實現(xiàn)代碼

 更新時間:2023年12月26日 10:38:53   作者:簡訊Alfred  
這篇文章主要為大家介紹了Pyqt5?Designer構建桌面應用設計及實現(xiàn)代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

概要

文章分為三部分,主要是界面的設計,py文件的代碼編寫和其余部分的小修小補。

設計界面

執(zhí)行pip install pyqt5-tools命令,安裝好可以在包目錄(類似C:\Programs\Python\Python37-32\Lib\site-packages\pyqt5_tools。)下找到designer.exe應用程序。

打開后可以看到如下界面:

應用界面

應用的左邊是構成用戶界面的各種組件,右邊是窗口以及組件的屬性和設置,中間就是你構建用戶界面的窗口。

我們可以結合自己的需求,發(fā)揮想象力設計出獨特的用戶界面。

設計過程中,可以使用Ctrl+R預覽界面。也可以初步體驗一些交互功能。

我們在界面右邊靠下部分,注意到有Signal/Slot Editor,我們可以在這里綁定一些事件。

例如我將spinBoxvalueChanged(int)progressBarsetValue(int)綁定,我們在預覽界面的時候,不斷增加數(shù)值,可以看到進度條也在同時改變。這些交互部分在生成代碼之后也有體現(xiàn)。

預覽

轉換為py代碼

設計好界面以后,我們需要轉換成python代碼,和我們的程序相結合,從單純的操作或命令行輸出,到用戶界面的誕生,我們還需要基于設計好的界面,再添磚加瓦。

轉換為python代碼是非常簡單的,只需要在設計保存好的ui文件目錄下,執(zhí)行命令:

pyuic5 -o test.py test.ui

這里需要兩個參數(shù),第一個是轉換成py代碼的文件名,第二個是需要轉換成py文件的ui文件。

轉換好以后就可以通過代碼與設計好的界面相結合了。

直接生成好的文件,我們還需要在底部添加如下代碼才能運行:

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)在我們只是需要以代碼的形式來生成用戶見面,不需要考慮太多。我個人認為使用命令行生成的代碼并不美觀,因為以上生成的代碼執(zhí)行過程中,需要給Ui_Form類的setupUi方法傳遞QtWidgets.QMainWindow(),其實更好的寫法是繼承它而不是作為參數(shù)傳遞它,如果使用繼承,將代碼里的Form直接更換為self,更為合理一些。當然現(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)

結合設計界面時的綁定操作,還是很好分析出每個組件具體有怎樣的屬性,以及如何綁定或改變。注意括號里都是方法名,名稱尾部沒有括號,因為我們只是將方法和組件綁定在一起,當組件發(fā)生改變時再調(diào)用方法。

補充

多線程的支持

我們設計好界面并和程序相結合,當我們執(zhí)行的時候會發(fā)現(xiàn)點擊一個按鈕后,如果程序正在執(zhí)行,那么界面會呈現(xiàn)假死狀態(tài),是因為現(xiàn)在的程序還只支持單線程工作,就好比在開發(fā)web界面的時候,如果設計到后臺發(fā)送郵件,如果不使用多線程或celery隊列等方式,那么頁面也會呈現(xiàn)假死狀態(tài)。

官方提供了QtCore.QThread類,但是由于我的程序比較特殊,無法使用這種方法,所以另辟蹊徑,使用python自帶的threading庫。

具體實現(xiàn)看以下代碼,需要根據(jù)實際情況自行修改:

# 導入 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)存在這樣一個問題,在你關閉界面后,如果線程所在的任務沒有執(zhí)行完畢,線程還是會繼續(xù)執(zhí)行,這一般來說不是我們想要的結果,我們一般希望在關閉界面后,所有任務也一同結束。

所以需要在thread_run方法里添加一行:

def thread_run(self):
    """創(chuàng)建線程"""
    thr = Thread(target=self.app_run)
    thr.setDaemon(True)
    thr.start()

將子線程設置為守護線程,在主程序退出的時候同時結束任務,無需等待子線程執(zhí)行完。

這樣以后我們在關閉程序界面的時候,按鈕綁定的任務也會同時結束。

尚未調(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()

這樣就不會報錯了。

點擊按鈕彈出新窗口

需要我們再設計一個界面。設計好后使用命令行轉換成py代碼。

然后在主界面中導入,并將該方法綁定需要彈出窗口的按鈕即可。

例如:

def show_good(self):
    """彈出窗口"""
    from good import Ui_Form
    ui = Ui_Form()
    MainWindow = QtWidgets.QDialog()
    ui.setupUi(MainWindow)
    MainWindow.show()
    MainWindow.exec_()

這樣下來一個簡單的桌面應用就搞定了。

具體可以參考陰陽師桌面版助手[1]

引用鏈接

陰陽師桌面版助手: https://github.com/alpha87/OnmyojiHelperGUI/releases 

以上就是Pyqt5 Designer構建桌面應用的詳細內(nèi)容,更多關于Pyqt5 Designer構建桌面應用的資料請關注腳本之家其它相關文章!

相關文章

最新評論