Python Qt GUI設(shè)計(jì):將UI文件轉(zhuǎn)換為Python文件的三種妙招(基礎(chǔ)篇—2)

在開始本文之前提醒各位朋友玉锌,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)整太多。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贝咙,一起剝皮案震驚了整個(gè)濱河市样悟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庭猩,老刑警劉巖窟她,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蔼水,居然都是意外死亡震糖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門趴腋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吊说,“玉大人,你說我怎么就攤上這事优炬“渚” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵蠢护,是天一觀的道長(zhǎng)雅宾。 經(jīng)常有香客問我,道長(zhǎng)糊余,這世上最難降的妖魔是什么秀又? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮贬芥,結(jié)果婚禮上吐辙,老公的妹妹穿的比我還像新娘。我一直安慰自己蘸劈,他們只是感情好昏苏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般贤惯。 火紅的嫁衣襯著肌膚如雪洼专。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天孵构,我揣著相機(jī)與錄音屁商,去河邊找鬼。 笑死颈墅,一個(gè)胖子當(dāng)著我的面吹牛蜡镶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恤筛,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼官还,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了毒坛?” 一聲冷哼從身側(cè)響起望伦,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煎殷,沒想到半個(gè)月后屯伞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝌数,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年愕掏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了度秘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顶伞。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剑梳,靈堂內(nèi)的尸體忽然破棺而出唆貌,到底是詐尸還是另有隱情,我是刑警寧澤垢乙,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布锨咙,位于F島的核電站,受9級(jí)特大地震影響追逮,放射性物質(zhì)發(fā)生泄漏酪刀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一钮孵、第九天 我趴在偏房一處隱蔽的房頂上張望骂倘。 院中可真熱鬧,春花似錦巴席、人聲如沸历涝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荧库。三九已至堰塌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間分衫,已是汗流浹背场刑。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚪战,地道東北人摇邦。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屎勘,于是被迫代替她去往敵國(guó)和親施籍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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