刚接触python的时候用pyqt5写了一个报告生成工具,后来回头看了下代码实在是写的太难看了。所有前后台逻辑都放在一个文件当中,非常不利于代码的查看以及画面的修改,每次画面修改后将UI文件转成PY文件后还需要重新将代码复制过去。鉴于此,决定重新写一遍,实现前后台逻辑的分离。
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
打开designer,注意不要与有道词典同时打开否则会未响应。
设计一个主窗口
添加一个标签和按钮
将文件保存后,在文件当前路径进入控制台,输入以下命令
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!"))
我们专门写一个主程序入口用于加载画面,并给后续的触发事件程序提供入口。
新建一个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_())
程序即可运行
initUI方法可以作为我们自定义触发事件的入口。
例如,我需要点击按钮后,在后台输出“hello world”
def initUI(self):
self.pushButton.clicked.connect(self._push1)
def _push1(self):
print('hello world')
点击按钮效果
如果事件逻辑复杂,建议重新写一个event.py,再导入该文件中的方法。
这样就基本实现了前后台逻辑的分离,main_csdn.py只作为前台逻辑和后台逻辑的入口。
这样做的好处就是,当前台画面修改频繁的时候,你只需要更新好UI的代码文件即可,主函数代码和事件函数代码不需要更改。
例如我现在需要再加一个按钮。
在designer中布好控件保存,再次执行转换命令
pyuic5 -o csdn.py csdn.ui