PyQt5界面与逻辑的分离

一、问题描述

当我们用QtDesigner制作完一个.ui界面后,转化成.py文件。之后又对此界面不太满意,想要重新修改完善界面,如果重新修改界面,对应的.py文件也会发生变化,除了自动生成的界面代码,我们还写入了其他逻辑功能程序代码,所以我们除了重新将完善后的.ui文件转化为.py文件外,也还要将自己的逻辑功能代码写进程序。所以工作量会很大。

二、问题思路

那有没有一种方法将界面文件与自己编写的逻辑程序代码分开呢,这样当我们修改界面后,只需生成对应的.py文件(界面文件)即可,自己编写的逻辑程序代码也不用跟着重新写进程序了,因为此时界面文件与自己的逻辑功能代码(逻辑文件)是相互独立的,不会受到界面文件变化的影响。即这就是所谓的界面与逻辑的分离。所以需要新建一个.py文件(逻辑文件)来调用界面文件,这个新建的.py文件也就是逻辑文件。

PyQt5界面与逻辑的分离

三、问题解决

  1. 首先以界面两次跳转为例。之前的代码都在一个文件里,即生成的界面代码与自己编写的逻辑功能代码都在同一个界面里。第一个界面文件(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_())
  1. 第一个界面(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)
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在PyQt6中,可以通过使用QThread类来创建线程,同时使用界面逻辑分离的方法可以使代码更加清晰易懂。 下面是一个简单的示例: ```python from PyQt6.QtCore import QThread, pyqtSignal from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget class Worker(QThread): finished = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) def run(self): # 在这里执行耗时操作 self.finished.emit() class MainWindow(QMainWindow): def __init__(self): super().__init__() self.button = QPushButton("开始") self.button.clicked.connect(self.start_work) self.setCentralWidget(QWidget(self)) self.centralWidget().setLayout(QVBoxLayout()) self.centralWidget().layout().addWidget(self.button) def start_work(self): self.button.setEnabled(False) self.worker = Worker() self.worker.finished.connect(self.finish_work) self.worker.start() def finish_work(self): self.button.setEnabled(True) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec() ``` 在此示例中,我们创建了一个Worker类作为我们的线程类,并重写了run方法以执行耗时操作。我们还定义了一个finished信号,当线程完成时会发出此信号。 在MainWindow类中,我们创建了一个QPushButton对象,当被点击时,我们创建一个Worker对象并启动它。我们还连接了Worker的finished信号到finish_work方法中,以在线程完成时更新主窗口。 通过这种方式,我们将逻辑界面分离,从而使代码更加易于维护和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值