PyQt5入門系列2:利用pyuic5將ui文件轉(zhuǎn)換為py文件

獲取更多文章和更新,請關(guān)注我的個人主頁:https://leiting6.cn

使用pyuic5

操作系統(tǒng)上正確配置python環(huán)境之后,pyuic5也是一個可以識別的命令行指令了:


image.png

直接鍵入"pycui5"回車是肯定會報(bào)錯的,因?yàn)椴]有跟參數(shù)。pyuic5是一個可以將上篇教程中用QtCreator生成的.ui文件轉(zhuǎn)換為python環(huán)境所需要的.py文件的,本系列教程里面只講它的一個用法:

pyuic5 -o destination.py source.ui

其中:

  • -o是操作參數(shù),表示要生成一個文件

  • destination.py是要生成的.py文件

  • source.ui是在此之前用QtCreator生成的包含UI設(shè)計(jì)的.ui文件

使用之前可以先將cmd工作目錄cd到.ui文件夾所在的目錄,如果你跟我一樣當(dāng)初存儲QtCreator工程的時(shí)候沒有更改.ui文件的名稱,那它現(xiàn)在也是叫mainwindow.ui,因此我們只需要鍵入:

pyuic5 -o main.py mainwindow.ui

回車后發(fā)現(xiàn)文件夾內(nèi)多了一個main.py文件,這個.py文件就是根據(jù)你的.ui文件轉(zhuǎn)換而來的。

image.png

用notepad++打開main.py,可以看到下面的內(nèi)容,開頭注釋也解釋了這個文件是由.ui轉(zhuǎn)換而來的:

image.png

在命令行中執(zhí)行:

python main.py

你會發(fā)現(xiàn)好像什么都沒有發(fā)生,很正常,因?yàn)樯约佑^察一下這個main.py文件就可以察覺,其中只包含一個名叫Ui_MainWindow的類,類之外沒有可以執(zhí)行的代碼,當(dāng)然現(xiàn)在執(zhí)行這個文件什么都不會發(fā)生。在此之前我希望初學(xué)者有一點(diǎn)python的基礎(chǔ)知識,因?yàn)檫@時(shí)候需要對main.py添加一點(diǎn)代碼使得設(shè)計(jì)好的UI能夠出現(xiàn)在我們面前。

只需要顯示UI界面的話,需要添加的代碼并不多:

  • main.py文件已經(jīng)自己引入了PyQt5庫中的幾個大類,QtCore, QtGui, QtWidgets;這不夠,我們還需要引入sys庫,所以添加:
import sys
  • 除次之外,我們需要在class之外添加一些代碼,將類實(shí)例化,并且運(yùn)行這個實(shí)例:
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

添加完成之后整個main.py是這個樣子的:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.5.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(314, 120)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_MainTitle = QtWidgets.QLabel(self.centralwidget)
        self.label_MainTitle.setGeometry(QtCore.QRect(3, 10, 311, 20))
        font = QtGui.QFont()
        font.setPointSize(15)
        self.label_MainTitle.setFont(font)
        self.label_MainTitle.setAlignment(QtCore.Qt.AlignCenter)
        self.label_MainTitle.setObjectName("label_MainTitle")
        self.lineEdit_Adder1 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_Adder1.setGeometry(QtCore.QRect(10, 40, 51, 20))
        self.lineEdit_Adder1.setObjectName("lineEdit_Adder1")
        self.lineEdit_Adder2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_Adder2.setGeometry(QtCore.QRect(90, 40, 51, 20))
        self.lineEdit_Adder2.setObjectName("lineEdit_Adder2")
        self.lineEdit_sum = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_sum.setGeometry(QtCore.QRect(170, 40, 51, 20))
        self.lineEdit_sum.setReadOnly(True)
        self.lineEdit_sum.setObjectName("lineEdit_sum")
        self.label_plus = QtWidgets.QLabel(self.centralwidget)
        self.label_plus.setGeometry(QtCore.QRect(60, 40, 31, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_plus.setFont(font)
        self.label_plus.setAlignment(QtCore.Qt.AlignCenter)
        self.label_plus.setObjectName("label_plus")
        self.label_equals = QtWidgets.QLabel(self.centralwidget)
        self.label_equals.setGeometry(QtCore.QRect(140, 40, 31, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_equals.setFont(font)
        self.label_equals.setAlignment(QtCore.Qt.AlignCenter)
        self.label_equals.setObjectName("label_equals")
        self.pushButton_calc = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_calc.setGeometry(QtCore.QRect(230, 40, 75, 23))
        self.pushButton_calc.setObjectName("pushButton_calc")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 314, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "加法器"))
        self.label_MainTitle.setText(_translate("MainWindow", "簡易加法器"))
        self.label_plus.setText(_translate("MainWindow", "+"))
        self.label_equals.setText(_translate("MainWindow", "="))
        self.pushButton_calc.setText(_translate("MainWindow", "計(jì)算"))

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)  # 創(chuàng)建一個QApplication,也就是你要開發(fā)的軟件app
    MainWindow = QtWidgets.QMainWindow()    # 創(chuàng)建一個QMainWindow,用來裝載你需要的各種組件、控件
    ui = Ui_MainWindow()                    # ui是Ui_MainWindow()類的實(shí)例化對象
    ui.setupUi(MainWindow)                  # 執(zhí)行類中的setupUi方法,方法的參數(shù)是第二步中創(chuàng)建的QMainWindow
    MainWindow.show()                       # 執(zhí)行QMainWindow的show()方法,顯示這個QMainWindow
    sys.exit(app.exec_())                   # 使用exit()或者點(diǎn)擊關(guān)閉按鈕退出QApplication

我在最后一段代碼的后面添加了注釋,大概解釋了一下每一步的作用。好了,我們再次在命令行中執(zhí)行:

python main.py

你會看到:

image.png

第一個和第二個本文框是可以輸入內(nèi)容的,第三個文本框卻不行,因?yàn)槲覀冊O(shè)置了只讀(readOnly)屬性,當(dāng)然點(diǎn)擊計(jì)算也是不會有結(jié)果的,畢竟還沒有編寫后臺邏輯。

另外

很多同學(xué)還是比較喜歡在類中添加init方法,其實(shí)也是可以的,寫了初始化方法之后,在初始化方法中執(zhí)行setupUI(),實(shí)例化之后就不需要再執(zhí)行setupUI()方法了,代碼如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.5.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_MainWindow(object):
    def __init__(self):
        self.setupUi(MainWindow)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(314, 120)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_MainTitle = QtWidgets.QLabel(self.centralwidget)
        self.label_MainTitle.setGeometry(QtCore.QRect(3, 10, 311, 20))
        font = QtGui.QFont()
        font.setPointSize(15)
        self.label_MainTitle.setFont(font)
        self.label_MainTitle.setAlignment(QtCore.Qt.AlignCenter)
        self.label_MainTitle.setObjectName("label_MainTitle")
        self.lineEdit_Adder1 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_Adder1.setGeometry(QtCore.QRect(10, 40, 51, 20))
        self.lineEdit_Adder1.setObjectName("lineEdit_Adder1")
        self.lineEdit_Adder2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_Adder2.setGeometry(QtCore.QRect(90, 40, 51, 20))
        self.lineEdit_Adder2.setObjectName("lineEdit_Adder2")
        self.lineEdit_sum = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_sum.setGeometry(QtCore.QRect(170, 40, 51, 20))
        self.lineEdit_sum.setReadOnly(True)
        self.lineEdit_sum.setObjectName("lineEdit_sum")
        self.label_plus = QtWidgets.QLabel(self.centralwidget)
        self.label_plus.setGeometry(QtCore.QRect(60, 40, 31, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_plus.setFont(font)
        self.label_plus.setAlignment(QtCore.Qt.AlignCenter)
        self.label_plus.setObjectName("label_plus")
        self.label_equals = QtWidgets.QLabel(self.centralwidget)
        self.label_equals.setGeometry(QtCore.QRect(140, 40, 31, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_equals.setFont(font)
        self.label_equals.setAlignment(QtCore.Qt.AlignCenter)
        self.label_equals.setObjectName("label_equals")
        self.pushButton_calc = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_calc.setGeometry(QtCore.QRect(230, 40, 75, 23))
        self.pushButton_calc.setObjectName("pushButton_calc")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 314, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "加法器"))
        self.label_MainTitle.setText(_translate("MainWindow", "簡易加法器"))
        self.label_plus.setText(_translate("MainWindow", "+"))
        self.label_equals.setText(_translate("MainWindow", "="))
        self.pushButton_calc.setText(_translate("MainWindow", "計(jì)算"))

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)  # 創(chuàng)建一個QApplication,也就是你要開發(fā)的軟件app
    MainWindow = QtWidgets.QMainWindow()    # 創(chuàng)建一個QMainWindow,用來裝載你需要的各種組件、控件
    ui = Ui_MainWindow()                    # ui是Ui_MainWindow()類的實(shí)例化對象
    MainWindow.show()                       # 執(zhí)行QMainWindow的show()方法,顯示這個QMainWindow
    sys.exit(app.exec_())                   # 使用exit()或者點(diǎn)擊關(guān)閉按鈕退出QApplication
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容