python PYQT5编写UI画面并实现前后台分离

1. 前言

刚接触python的时候用pyqt5写了一个报告生成工具,后来回头看了下代码实在是写的太难看了。所有前后台逻辑都放在一个文件当中,非常不利于代码的查看以及画面的修改,每次画面修改后将UI文件转成PY文件后还需要重新将代码复制过去。鉴于此,决定重新写一遍,实现前后台逻辑的分离。

2. 安装pyqt5包

pip install PyQt5==5.8.2

安装PYQT5版本5.8.2,高于此版本会出现打包问题。

pip install pyqt5-tools

安装qtdesigner,在python路径下找到designer.exe。
以下是我的路径:
python37\Lib\site-packages\pyqt5_tools\Qt\bin
python PYQT5编写UI画面并实现前后台分离_第1张图片

3. 画界面

打开designer,注意不要与有道词典同时打开否则会未响应。
设计一个主窗口
python PYQT5编写UI画面并实现前后台分离_第2张图片添加一个标签和按钮
python PYQT5编写UI画面并实现前后台分离_第3张图片将文件保存后,在文件当前路径进入控制台,输入以下命令

pyuic5 -o csdn.py csdn.ui

在这里插入图片描述该命令可将UI文件转换为PY文件。
此时我们打开该文件就可以查看其中的代码,但是还不直接运行。

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

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

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(308, 301)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(110, 170, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(110, 40, 91, 61))
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 308, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.label.setText(_translate("MainWindow", "Hello World!"))


4. 主程序入口

我们专门写一个主程序入口用于加载画面,并给后续的触发事件程序提供入口。
新建一个main_csdn.py

import sys
from PyQt5.QtWidgets import QMainWindow,QApplication
from csdn import Ui_MainWindow
class my_ComboBox(Ui_MainWindow):
    def __init__(self,mainWindow):
        super().__init__()
        self.setupUi(mainWindow)
        self.initUI()

    def initUI(self):
        pass

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = QMainWindow()
    form = my_ComboBox(mainWindow)
    mainWindow.show()
    sys.exit(app.exec_())

程序即可运行
python PYQT5编写UI画面并实现前后台分离_第4张图片
initUI方法可以作为我们自定义触发事件的入口。
例如,我需要点击按钮后,在后台输出“hello world”

    def initUI(self):
        self.pushButton.clicked.connect(self._push1)

    def _push1(self):
        print('hello world')

点击按钮效果
python PYQT5编写UI画面并实现前后台分离_第5张图片如果事件逻辑复杂,建议重新写一个event.py,再导入该文件中的方法。
这样就基本实现了前后台逻辑的分离,main_csdn.py只作为前台逻辑和后台逻辑的入口。
这样做的好处就是,当前台画面修改频繁的时候,你只需要更新好UI的代码文件即可,主函数代码和事件函数代码不需要更改。
例如我现在需要再加一个按钮。
python PYQT5编写UI画面并实现前后台分离_第6张图片在designer中布好控件保存,再次执行转换命令

pyuic5 -o csdn.py csdn.ui

直接运行主函数,画面已经被更新了
python PYQT5编写UI画面并实现前后台分离_第7张图片

你可能感兴趣的:(python PYQT5编写UI画面并实现前后台分离)