PyQt5入门系列2:利用pyuic5将ui文件转换为py文件

获取更多文章和更新,请关注我的个人主页:https://leiting6.cn

使用pyuic5

操作系统上正确配置python环境之后,pyuic5也是一个可以识别的命令行指令了:


image.png

直接键入"pycui5"回车是肯定会报错的,因为并没有跟参数。pyuic5是一个可以将上篇教程中用QtCreator生成的.ui文件转换为python环境所需要的.py文件的,本系列教程里面只讲它的一个用法:

pyuic5 -o destination.py source.ui

其中:

  • -o是操作参数,表示要生成一个文件

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

  • source.ui是在此之前用QtCreator生成的包含UI设计的.ui文件

使用之前可以先将cmd工作目录cd到.ui文件夹所在的目录,如果你跟我一样当初存储QtCreator工程的时候没有更改.ui文件的名称,那它现在也是叫mainwindow.ui,因此我们只需要键入:

pyuic5 -o main.py mainwindow.ui

回车后发现文件夹内多了一个main.py文件,这个.py文件就是根据你的.ui文件转换而来的。

image.png

用notepad++打开main.py,可以看到下面的内容,开头注释也解释了这个文件是由.ui转换而来的:

image.png

在命令行中执行:

python main.py

你会发现好像什么都没有发生,很正常,因为稍加观察一下这个main.py文件就可以察觉,其中只包含一个名叫Ui_MainWindow的类,类之外没有可以执行的代码,当然现在执行这个文件什么都不会发生。在此之前我希望初学者有一点python的基础知识,因为这时候需要对main.py添加一点代码使得设计好的UI能够出现在我们面前。

只需要显示UI界面的话,需要添加的代码并不多:

  • main.py文件已经自己引入了PyQt5库中的几个大类,QtCore, QtGui, QtWidgets;这不够,我们还需要引入sys库,所以添加:
import sys
  • 除次之外,我们需要在class之外添加一些代码,将类实例化,并且运行这个实例:
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", "计算"))

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)  # 创建一个QApplication,也就是你要开发的软件app
    MainWindow = QtWidgets.QMainWindow()    # 创建一个QMainWindow,用来装载你需要的各种组件、控件
    ui = Ui_MainWindow()                    # ui是Ui_MainWindow()类的实例化对象
    ui.setupUi(MainWindow)                  # 执行类中的setupUi方法,方法的参数是第二步中创建的QMainWindow
    MainWindow.show()                       # 执行QMainWindow的show()方法,显示这个QMainWindow
    sys.exit(app.exec_())                   # 使用exit()或者点击关闭按钮退出QApplication

我在最后一段代码的后面添加了注释,大概解释了一下每一步的作用。好了,我们再次在命令行中执行:

python main.py

你会看到:

image.png

第一个和第二个本文框是可以输入内容的,第三个文本框却不行,因为我们设置了只读(readOnly)属性,当然点击计算也是不会有结果的,毕竟还没有编写后台逻辑。

另外

很多同学还是比较喜欢在类中添加init方法,其实也是可以的,写了初始化方法之后,在初始化方法中执行setupUI(),实例化之后就不需要再执行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", "计算"))

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)  # 创建一个QApplication,也就是你要开发的软件app
    MainWindow = QtWidgets.QMainWindow()    # 创建一个QMainWindow,用来装载你需要的各种组件、控件
    ui = Ui_MainWindow()                    # ui是Ui_MainWindow()类的实例化对象
    MainWindow.show()                       # 执行QMainWindow的show()方法,显示这个QMainWindow
    sys.exit(app.exec_())                   # 使用exit()或者点击关闭按钮退出QApplication
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容