在開始本文之前提醒各位朋友玉锌,Python記得安裝PyQt5庫(kù)文件,Python語(yǔ)言功能很強(qiáng),但是Python自帶的GUI開發(fā)庫(kù)Tkinter功能很弱泌类,難以開發(fā)出專業(yè)的GUI。好在Python語(yǔ)言的開放性底燎,很容易將其他語(yǔ)言(特別是C/C++)的類庫(kù)封裝為Python綁定刃榨,而Qt是非常優(yōu)秀的C++ GUI 類庫(kù),所以就有了PyQt双仍。
安裝指令如下所示:
pip install pyqt5
這也Python基礎(chǔ)知識(shí)枢希,不在本專欄主講范疇,簡(jiǎn)單聊聊朱沃。
Qt Designer苞轿,即Qt設(shè)計(jì)師,是一個(gè)強(qiáng)大逗物、靈活的可視化GUI設(shè)計(jì)工具搬卒,可以幫助我們加快開發(fā)PyQt程序的速度。
Qt Designer 是專門用來制作PyQt程序中UI界面的工具翎卓,它生成的UI界面是一個(gè)后綴為.ui 的文件契邀。制作程序UI界面,一般可以通過UI制作工具和純代碼編寫兩種方式來實(shí)現(xiàn)失暴,我們主要是通過Qt Creator制作完成坯门。
該文件使用非常簡(jiǎn)單,可以通過命令將.ui文件轉(zhuǎn)換成.py格式的文件逗扒,并被其他Python文件引用田盈,也可以通過Eric 6進(jìn)行手工轉(zhuǎn)換。
本博文以命令的方式為主缴阎,手工的方式為輔允瞧,但是原理和結(jié)果是一樣的,各位可以根據(jù)自己的偏好進(jìn)行選擇蛮拔。
Qt Designer 符合MVC(模型―視圖—控制器)設(shè)計(jì)模式述暂,做到了顯示和業(yè)務(wù)邏輯的分離,具有以下優(yōu)點(diǎn):
使用簡(jiǎn)單建炫,通過拖曳和點(diǎn)擊就可以完成復(fù)雜的界面設(shè)計(jì)畦韭,而且還可以隨時(shí)預(yù)覽查看效果圖。
轉(zhuǎn)換Python文件方便肛跌。Qt Designer 可以將設(shè)計(jì)好的用戶界面保存為.ui文件艺配,其實(shí)是XML 格式的文本文件察郁。為了在PyQt中使用.ui文件,可以通過pyuic5命令將.ui文件轉(zhuǎn)換為.py文件件转唉,然后將.py文件引入到自定義的Python代碼中皮钠。
Qt Creator 的界面很簡(jiǎn)潔,上方是主菜單欄赠法,左側(cè)是主工具欄麦轰,窗口的中間部分是工作區(qū)。根據(jù)設(shè)計(jì)內(nèi)容不同砖织,工作區(qū)會(huì)顯示不同的內(nèi)容款侵。
主窗口左側(cè)是主工具欄,主工具欄提供了項(xiàng)目文件編輯侧纯、窗體設(shè)計(jì)新锈、程序調(diào)試、項(xiàng)目設(shè)置等各種功能按鈕眶熬。
在左側(cè)主工具欄單擊“Welcome(歡迎)”按鈕后顯示實(shí)例的界面壕鹉。這時(shí)工作區(qū)的左側(cè)有 “Projects”、“Examples(示例)”聋涨、“Tutorials(教程)”晾浴、“Get Started Now”幾個(gè)按鈕,單擊后會(huì)在主工作區(qū)顯示相應(yīng)的內(nèi)容:
單擊“Projects”按鈕后牍白,工作區(qū)顯示新建項(xiàng)目按鈕和最近打開項(xiàng)目的列表脊凰。
單擊“Examples(示例)”按鈕后,工作區(qū)顯示 Qt 自帶的大量實(shí)例茂腥,選擇某個(gè)實(shí)例就可以在 Qt Creator 中打開該項(xiàng)目源程序狸涌。
單擊“Tutorials(教程)”按鈕后,工作區(qū)顯示各種視頻教程最岗,查看視頻教程需要聯(lián)網(wǎng)并使用瀏覽器打開帕胆。
單擊“Get Started Now”按鈕,工作區(qū)顯示“Qt Creator Manual”幫助主題內(nèi)容般渡。
學(xué)習(xí)一種編程語(yǔ)言或編程環(huán)境懒豹,通常會(huì)先編寫一個(gè)“Hello World”程序。我們也用 Qt Creator 編寫一個(gè)“Hello World”程序驯用,以初步了解 Qt Creator 設(shè)計(jì)應(yīng)用程序的基本過程脸秽,對(duì)使用 Qt Creator 編寫 Qt Python 應(yīng)用程序建立初步的了解。
1蝴乔、創(chuàng)建項(xiàng)目
第1步:?jiǎn)螕?Qt Creator 的菜單項(xiàng)文件->新建文件或項(xiàng)目记餐,出現(xiàn)如下圖所示的對(duì)話框。在這個(gè)對(duì)話框里選擇需要?jiǎng)?chuàng)建的項(xiàng)目或文件的模板薇正。
Qt Creator 可以創(chuàng)建多種項(xiàng)目片酝,在最左側(cè)的列表框中單擊“Application”囚衔,中間的列表框中列出了可以創(chuàng)建的應(yīng)用程序的模板,各類應(yīng)用程序如下:
Qt Widgets Application雕沿,支持桌面平臺(tái)的有圖形用戶界面(Graphic User Interface练湿,GUI) 界面的應(yīng)用程序。GUI 的設(shè)計(jì)完全基于 C++ 語(yǔ)言晦炊,采用 Qt 提供的一套 C++ 類庫(kù)鞠鲜。
Qt Console Application宁脊,控制臺(tái)應(yīng)用程序断国,無 GUI 界面,一般用于學(xué)習(xí) C/C++ 語(yǔ)言榆苞,只需要簡(jiǎn)單的輸入輸出操作時(shí)可創(chuàng)建此類項(xiàng)目稳衬。
Qt for Python - Empty,創(chuàng)建一個(gè)只包含QApplication主代碼的Python應(yīng)用程序的Qt坐漏。
Qt for Python - Window薄疚,創(chuàng)建一個(gè)包含空窗口的Qt用于Python應(yīng)用程序。
Qt Quick Application - Empty赊琳,創(chuàng)建一個(gè)Qt Quick 2應(yīng)用程序項(xiàng)目街夭,它可以包含QML和C++代碼。你可以構(gòu)建應(yīng)用程序并將其部署到桌面躏筏、嵌入式和移動(dòng)目標(biāo)平臺(tái)板丽。
Qt Quick Application - Scroll,使用ScrollView組件實(shí)現(xiàn)可滾動(dòng)列表視圖(需要 Qt 5.9或更高版本)趁尼。
Qt Quick Application - Stack埃碱,使用StackView組件實(shí)現(xiàn)一組基于堆棧的導(dǎo)航模型的頁(yè)面(需要 Qt 5.7或更高版本)。
Qt Quick Application - Swipe酥泞,使用SwipeView組件實(shí)現(xiàn)一組基于滑動(dòng)的導(dǎo)航模型的頁(yè)面(需要Qt 5.7或更高版本)砚殿。
第2步:這里創(chuàng)建一個(gè)Qt for Python - Empty應(yīng)用程序模板就可以,如下圖所示:
第3步:鼠標(biāo)右擊main工程芝囤,在工程下新建一個(gè)主窗口的界面ui文件似炎,如下圖所示:
此時(shí)工程文件如下所示:
第4步:雙擊進(jìn)入mainwindow.ui文件,設(shè)計(jì)Hello,world悯姊!顯示效果名党,如下所示:
使用代碼編輯軟件打開UI文件,可見相關(guān)的數(shù)據(jù)參數(shù)挠轴,如下所示:
2传睹、將.ui文件生成.py文件
使用Qt Designer 設(shè)計(jì)的用戶界面默認(rèn)保存為.ui文件,其內(nèi)容結(jié)構(gòu)類似于XML岸晦,但這種文件并不是我們想要的欧啤,我們想要的是.py 文件睛藻,所以還需要使用其他方法將.ui文件轉(zhuǎn)換為.py文件。本博文聊聊3種方法邢隧。
2.1店印、Eric 6編譯
最簡(jiǎn)單的方法是通過Eric 6手工編譯.ui文件,只需要單擊鼠標(biāo)就能完成倒慧。
第1步按摘,下載Eric 6軟件,下載地址:http://eric-ide.python-projects.org/eric-download.html
下載Eric 6后纫谅,點(diǎn)擊install.py文件進(jìn)行安裝炫贤,如下所示:
安裝中~?
安裝完成后,可在Python安裝包路徑:找到eric6文件夾付秕,例如我的Python安裝的D盤兰珍,路徑為:D:\Python_3.8.3\Lib\site-packages\eric6,并找到eric6.pyw文件询吴,點(diǎn)擊運(yùn)行掠河,效果如下所示:
第2步:配置Eric6,進(jìn)入菜單欄設(shè)置->首選項(xiàng)猛计,如下所示:
在左側(cè)列表中選擇項(xiàng)目->多重項(xiàng)目唠摹,點(diǎn)擊右側(cè)圖標(biāo)后選定工程文件位置,我這里是桌面文件夾奉瘤,如下所示:
第3步:建立項(xiàng)目勾拉,菜單欄中選擇項(xiàng)目->新建,創(chuàng)建項(xiàng)目毛好,效果如下所示:
點(diǎn)擊OK后望艺,注意,Eric 6存在許多奇奇怪怪不知名的問題肌访,點(diǎn)擊是否將已有文件添加到工程YES找默,可能會(huì)卡死,這里點(diǎn)擊NO吼驶,僅僅創(chuàng)建項(xiàng)目即可惩激,如下所示:
第4步:導(dǎo)入U(xiǎn)I文件并編譯,此時(shí)可見左側(cè)項(xiàng)目瀏覽器點(diǎn)亮可編輯蟹演,如下所示:
點(diǎn)擊窗體风钻,添加窗體(也就是咱設(shè)計(jì)好的UI文件),如下所示:
此時(shí)可見源代碼下有編譯好的Python文件:Ui_mainwindow.py酒请,如下所示:
可在桌面Demo文件夾中點(diǎn)擊查看骡技,如下所示:
UI文件轉(zhuǎn)換的Python代碼內(nèi)容如下所示:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'C:\Users\Administrator\Desktop\Demo\mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.? Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
? ? def setupUi(self, MainWindow):
? ? ? ? MainWindow.setObjectName("MainWindow")
? ? ? ? MainWindow.resize(320, 240)
? ? ? ? self.centralwidget = QtWidgets.QWidget(MainWindow)
? ? ? ? self.centralwidget.setObjectName("centralwidget")
? ? ? ? self.label = QtWidgets.QLabel(self.centralwidget)
? ? ? ? self.label.setGeometry(QtCore.QRect(80, 50, 151, 141))
? ? ? ? font = QtGui.QFont()
? ? ? ? font.setPointSize(15)
? ? ? ? self.label.setFont(font)
? ? ? ? self.label.setObjectName("label")
? ? ? ? MainWindow.setCentralWidget(self.centralwidget)
? ? ? ? self.statusbar = QtWidgets.QStatusBar(MainWindow)
? ? ? ? self.statusbar.setObjectName("statusbar")
? ? ? ? MainWindow.setStatusBar(self.statusbar)
? ? ? ? self.actioncheng = QtWidgets.QAction(MainWindow)
? ? ? ? self.actioncheng.setObjectName("actioncheng")
? ? ? ? self.retranslateUi(MainWindow)
? ? ? ? QtCore.QMetaObject.connectSlotsByName(MainWindow)
? ? def retranslateUi(self, MainWindow):
? ? ? ? _translate = QtCore.QCoreApplication.translate
? ? ? ? MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
? ? ? ? self.label.setText(_translate("MainWindow", "Hello,World!"))
? ? ? ? self.actioncheng.setText(_translate("MainWindow", "cheng"))
if __name__ == "__main__":
? ? import sys
? ? app = QtWidgets.QApplication(sys.argv)
? ? MainWindow = QtWidgets.QMainWindow()
? ? ui = Ui_MainWindow()
? ? ui.setupUi(MainWindow)
? ? MainWindow.show()
? ? sys.exit(app.exec_())
運(yùn)行Python文件,即可查看GUI效果,如下所示:
2.2布朦、Python命令行編譯
Python命令行將UI文件編譯成Python文件依托于pyuic5命令囤萤。
PyQt 5安裝成功后,pyuic5命令默認(rèn)安裝在Python安裝包目錄Scripts文件下是趴,例如我的安裝在:D:\Python_3.8.3\Scripts涛舍,效果如下所示:
第1步:執(zhí)行指令,將UI文件生成Python代碼唆途,指令如下所示:
pyuic5 -o mainwindow.py mainwindow.ui
此時(shí)將mainwindow.ui生成mainwindow.py文件富雅,效果如下所示:
第2步:將mainwindow.py添加入Qt Creator當(dāng)時(shí)創(chuàng)建的工程,如下所示:
最后在main函數(shù)中編寫調(diào)用GUI的程序(可參見 2.1肛搬、Eric 6編譯 調(diào)用的例程代碼)没佑,6行代碼如下所示:
# This Python file uses the following encoding: utf-8
import sys
from PySide2.QtWidgets import QApplication
#添加的所需庫(kù)文件
from PyQt5 import QtCore, QtGui, QtWidgets
#mainwindow.ui Python文件
import mainwindow
if __name__ == "__main__":
? ? app = QApplication([])
? ? #此處調(diào)用GUI的程序
? ? widgets = QtWidgets.QMainWindow()
? ? ui = mainwindow.Ui_MainWindow()
? ? ui.setupUi(widgets)
? ? widgets.show()
? ? #結(jié)束
? ? sys.exit(app.exec_())
點(diǎn)擊運(yùn)行,GUI效果如下所示:
最后補(bǔ)充一點(diǎn)滚婉,?Qt Creator運(yùn)行Python文件需要提前安裝配置好Python環(huán)境图筹,否則無法正常編譯運(yùn)行帅刀,這里就不再贅述安裝過程了让腹。
2.3、腳本編譯
有些朋友可能對(duì)2.2扣溺、Python命令行編譯的方式不熟悉或者不太喜歡骇窍,這里再拓展講講Python腳本編譯的方法,腳本本質(zhì)上是用Python代碼把上述操作封裝起來锥余,腳本代碼如下所示:
import os
import os.path
dir ='./' #文件所在的路徑
#找出路徑下所有的.ui文件
def listUiFile():
? ? list = []
? ? files = os.listdir(dir)
? ? for filename in files:
? ? ? ? #print(filename)
? ? ? ? if os.path.splitext(filename)[1] == '.ui':
? ? ? ? ? ? list.append(filename)
? ? return list
#把擴(kuò)展名未.ui的轉(zhuǎn)換成.py的文件
def transPyFile(filename):
? ? return os.path.splitext(filename)[0] + '.py'
#通過命令把.ui文件轉(zhuǎn)換成.py文件
def runMain():
? ? list = listUiFile()
? ? for uifile in list:
? ? ? ? pyfile = transPyFile(uifile)
? ? ? ? cmd = 'pyuic5 -o {pyfile} {uifile}'.format(pyfile=pyfile, uifile=uifile)
? ? ? ? os.system(cmd)
if __name__ =="__main__":
? ? runMain()
只要把腳本代碼Python文件放在需要轉(zhuǎn)換UI界面文件的目錄下腹纳,直接運(yùn)行,就可以將UI文件編譯為Python文件驱犹。
3嘲恍、界面、邏輯分離思想
通過之前的內(nèi)容學(xué)會(huì)了如何制作.ui文件雄驹,以及如何把.ui文件轉(zhuǎn)換成.py文件佃牛,最后再補(bǔ)充講講界面、邏輯分離思想医舆。
值得注意的是俘侠,由于這里的.py文件是由.ui文件編譯而來的,因此當(dāng).py文件發(fā)生變化時(shí)蔬将,對(duì)應(yīng)的.py文件也會(huì)發(fā)生變化爷速。可以把這種由.ui文件編譯而來的.py文件稱為界面文件霞怀。
由于界面文件每次編譯時(shí)都會(huì)初始化惫东,所以需要新建一個(gè).py文件調(diào)用界面文件,這個(gè)新建的.py文件被稱為邏輯文件毙石,也可以稱為業(yè)務(wù)文件廉沮。
界面文件和邏輯文件是兩個(gè)相對(duì)獨(dú)立的文件禁谦,通過上述方法就實(shí)現(xiàn)了界面與邏輯的分離(也可以說是“顯示和業(yè)務(wù)邏輯的分離")。
實(shí)現(xiàn)界面與邏輯的分離方法很簡(jiǎn)單废封,只需要新建一個(gè)邏輯處理Python文件州泊,繼承界面文件的主窗口類即可,后續(xù)項(xiàng)目我們會(huì)講到實(shí)際的應(yīng)用漂洋。
如果以后想要更新界面遥皂,只需要對(duì).ui文件進(jìn)行更新,然后再編譯成對(duì)應(yīng)的.py 文件即可刽漂。而邏輯文件則視情況做一些調(diào)整演训,一般情況下不需要調(diào)整太多。