一、问题描述
当我们用QtDesigner制作完一个.ui界面后,转化成.py文件。之后又对此界面不太满意,想要重新修改完善界面,如果重新修改界面,对应的.py文件也会发生变化,除了自动生成的界面代码,我们还写入了其他逻辑功能程序代码,所以我们除了重新将完善后的.ui文件转化为.py文件外,也还要将自己的逻辑功能代码写进程序。所以工作量会很大。
二、问题思路
那有没有一种方法将界面文件与自己编写的逻辑程序代码分开呢,这样当我们修改界面后,只需生成对应的.py文件(界面文件)即可,自己编写的逻辑程序代码也不用跟着重新写进程序了,因为此时界面文件与自己的逻辑功能代码(逻辑文件)是相互独立的,不会受到界面文件变化的影响。即这就是所谓的界面与逻辑的分离。所以需要新建一个.py文件(逻辑文件)来调用界面文件,这个新建的.py文件也就是逻辑文件。
PyQt5界面与逻辑的分离
三、问题解决
- 首先以界面两次跳转为例。之前的代码都在一个文件里,即生成的界面代码与自己编写的逻辑功能代码都在同一个界面里。第一个界面文件(experiment_5.py)代码如下:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
import experiment_6
from experiment_6 import *
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent = None):
super(Ui_MainWindow, self).__init__(parent)
self.setupUi(self)
self.retranslateUi(self)
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(330, 160, 131, 51))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.pushButton.clicked.connect(self.function)
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", "进入第二个界面"))
def function(self):
ui_1.show()
MainWindow.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = Ui_MainWindow()
ui_1 = experiment_6.Ui_Form()
ui_1.pushButton.clicked.connect(MainWindow.show)
ui_1.pushButton.clicked.connect(ui_1.close)
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
第二个界面文件(experiment_6.py)代码如下:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget
import sys
class Ui_Form(QtWidgets.QMainWindow):
def __init__(self):
super(Ui_Form, self).__init__() # 此中的Ui_Form要与所在类名保持一致
self.setupUi(self)
self.retranslateUi(self)
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(122, 120, 121, 28))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "返回第一个界面"))
if __name__ == '__main__':
app = QApplication(sys.argv)
Widget = QWidget()
ui = Ui_Form()
ui.setupUi(Widget)
Widget.show()
sys.exit(app.exec_())
- 第一个界面(experiment_5.py)的分离
experiment_5.ui转化为experiment——5.py的纯界面代码(界面代码)如下:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
import experiment_6
from experiment_6 import *
class Ui_MainWindow(object):
# def __init__(self, parent = None):
# super(Ui_MainWindow, self).__init__(parent)
# self.setupUi(self)
# self.retranslateUi(self)
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(330, 160, 131, 51))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
# self.pushButton.clicked.connect(self.function)
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", "进入第二个界面"))
# def function(self):
# ui_1.show()
# MainWindow.close()
#if __name__ == '__main__':
# app = QApplication(sys.argv)
# MainWindow = QMainWindow()
# ui = Ui_MainWindow()
# ui_1 = experiment_6.Ui_Form()
# ui_1.pushButton.clicked.connect(MainWindow.show)
# ui_1.pushButton.clicked.connect(ui_1.close)
# ui.setupUi(MainWindow)
# MainWindow.show()
# sys.exit(app.exec_())
我们需要新建一个.py文件(逻辑文件)来调用experiment_5.py界面文件。将逻辑文件命名为callExperiment_5.py。添加逻辑功能代码如下:
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
from experiment_5 import *
from experiment_5 import Ui_MainWindow
import callExperiment_6
from callExperiment_6 import *
class TheFirstWindow (QMainWindow, Ui_MainWindow):
def __init__(self,parent = None):
super(TheFirstWindow, self).__init__(parent) # 此中的Ui_Form要与所在类名保持一致
self.setupUi(self)
self.retranslateUi(self)
self.pushButton.clicked.connect(self.function)
def function(self):
ui_1.show()
MainWindow.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = TheFirstWindow()
ui_1 = callExperiment_6.TheSecondWindow()
ui_1.pushButton.clicked.connect(MainWindow.show)
ui_1.pushButton.clicked.connect(ui_1.close)
MainWindow.show()
sys.exit(app.exec_())
同时需要新建一个.py文件(逻辑文件)来调用experiment_6.py界面文件。将逻辑文件命名为callExperiment_6.py。添加逻辑功能代码如下:
from PyQt5.QtWidgets import QApplication, QMainWindow
from experiment_6 import Ui_Form
class TheSecondWindow(QMainWindow, Ui_Form):
def __init__(self,parent = None):
super(TheSecondWindow, self).__init__(parent) # 此中的Ui_Form要与所在类名保持一致
self.setupUi(self)
self.retranslateUi(self)