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

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

作者: 雷霆同学 | 来源:发表于2018-03-18 14:31 被阅读0次

    获取更多文章和更新,请关注我的个人主页: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
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/wfyeqftx.html