Python 如何用另一个框架替换框架

Python 如何用另一个框架替换框架,python,pyqt5,Python,Pyqt5,我有一个需要用另一个框架替换一个框架的要求。我已经实现了下面的代码,这是工作良好,但问题是,我在同一个文件中做。如果我在一个.py文件中创建frame1,在另一个.py文件中创建frame2,并且仍然获得相同的结果,是否可能 下面的解决方案不会有帮助,因为它会在单个文件中创建大量代码 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow):

我有一个需要用另一个框架替换一个框架的要求。我已经实现了下面的代码,这是工作良好,但问题是,我在同一个文件中做。如果我在一个.py文件中创建frame1,在另一个.py文件中创建frame2,并且仍然获得相同的结果,是否可能

下面的解决方案不会有帮助,因为它会在单个文件中创建大量代码

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(434, 362)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(10, 10, 411, 311))
        self.frame.setFrameShape(QtWidgets.QFrame.Box)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")


        self.frame_2 = QtWidgets.QFrame(self.centralwidget)
        self.frame_2.setGeometry(QtCore.QRect(10, 10, 411, 311))
        self.frame_2.setFrameShape(QtWidgets.QFrame.Box)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")


        self.label = QtWidgets.QLabel(self.frame_2)
        self.label.setGeometry(QtCore.QRect(10, 10, 131, 16))
        self.label.setObjectName("label")
    
        self.label_2 = QtWidgets.QLabel(self.frame)
        self.label_2.setGeometry(QtCore.QRect(10, 20, 131, 16))
        self.label_2.setObjectName("label_2")

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 330, 411, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.changeFrame)
        MainWindow.setCentralWidget(self.centralwidget)

       self.frame.show()
       self.frame_2.hide()
    
       self.retranslateUi(MainWindow)
       QtCore.QMetaObject.connectSlotsByName(MainWindow)

   def retranslateUi(self, MainWindow):
       _translate = QtCore.QCoreApplication.translate
       MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
       self.label.setText(_translate("MainWindow", "Second Frame"))
       self.label_2.setText(_translate("MainWindow", "First Frame"))
       self.pushButton.setText(_translate("MainWindow", "Frame Change"))

   def changeFrame(self):
       self.frame.hide()
       self.frame_2.show()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
Frame1.Py
您的问题并不复杂,但如果您需要许多改进:

  • 如果要更改小部件的可见性(而不是替换),则必须使用QStackedLayout或QStackedWidget

  • 在最初的示例中使用QFrame,但在新代码中使用QMainWindow,这令人困惑,因为每个小部件都有一个目标,在QMainWindow中,它是一个具有预定义结构的窗口。因此,我将从头开始重新创建frame1.py和frame2.py

  • QtDesigner生成的代码不是小部件,因此必须使用其他类作为基础(有关更多信息,请参阅)

考虑到上述情况,框架1和框架2的设计应基于QFrame创建:

frame1.ui


框架
0
0
400
300
框架
第一帧
Qt::AlignCenter
frame2.ui


框架
0
0
400
300
框架
第二帧
Qt::AlignCenter
将.ui转换为.py:

pyuic5 frame1.ui -o frame1_ui.py -x
pyuic5 frame2.ui -o frame2_ui.py -x
pyuic5 mainwindow.ui -o mainwindow_ui.py -x
创建frame1.py和frame2.py:

frame1.py

from PyQt5 import QtWidgets

from mainwindow_ui import Ui_MainWindow
from frame1 import Frame1
from frame2 import Frame2


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.frame1 = Frame1()
        self.frame2 = Frame2()

        self.stackedWidget.addWidget(self.frame1)
        self.stackedWidget.addWidget(self.frame2)

        self.btn1.clicked.connect(self.on_clicked1)
        self.btn2.clicked.connect(self.on_clicked2)

    def on_clicked1(self):
        self.stackedWidget.setCurrentIndex(0)

    def on_clicked2(self):
        self.stackedWidget.setCurrentIndex(1)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
从PyQt5导入QtWidgets
从frame1\u ui导入ui\u框架
类Frame1(qtwidts.QFrame,Ui_Frame):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setupUi(self)
frame2.py

from PyQt5 import QtWidgets

from mainwindow_ui import Ui_MainWindow
from frame1 import Frame1
from frame2 import Frame2


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.frame1 = Frame1()
        self.frame2 = Frame2()

        self.stackedWidget.addWidget(self.frame1)
        self.stackedWidget.addWidget(self.frame2)

        self.btn1.clicked.connect(self.on_clicked1)
        self.btn2.clicked.connect(self.on_clicked2)

    def on_clicked1(self):
        self.stackedWidget.setCurrentIndex(0)

    def on_clicked2(self):
        self.stackedWidget.setCurrentIndex(1)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
从PyQt5导入QtWidgets
从frame2\u ui导入ui\u框架
类Frame2(qtwidts.QFrame,Ui_Frame):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setupUi(self)
您必须创建一个QMainWindow,其中包含您想要显示的QFrame中的任意多个按钮,并建立一个QStackedWidget:

main window.ui


主窗口
0
0
800
600
主窗口
按钮
按钮
Qt::垂直
20
40
0
0
800
26
从.ui转换为.py:

pyuic5 frame1.ui -o frame1_ui.py -x
pyuic5 frame2.ui -o frame2_ui.py -x
pyuic5 mainwindow.ui -o mainwindow_ui.py -x
在main.py中实现逻辑:

main.py

from PyQt5 import QtWidgets

from mainwindow_ui import Ui_MainWindow
from frame1 import Frame1
from frame2 import Frame2


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.frame1 = Frame1()
        self.frame2 = Frame2()

        self.stackedWidget.addWidget(self.frame1)
        self.stackedWidget.addWidget(self.frame2)

        self.btn1.clicked.connect(self.on_clicked1)
        self.btn2.clicked.connect(self.on_clicked2)

    def on_clicked1(self):
        self.stackedWidget.setCurrentIndex(0)

    def on_clicked2(self):
        self.stackedWidget.setCurrentIndex(1)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

您的问题并不复杂,但如果您需要许多改进:

  • 如果要更改小部件的可见性(而不是替换),则必须使用QStackedLayout或QStackedWidget

  • 在最初的示例中使用QFrame,但在新代码中使用QMainWindow,这令人困惑,因为每个小部件都有一个目标,在QMainWindow中,它是一个具有预定义结构的窗口。因此,我将从头开始重新创建frame1.py和frame2.py

  • QtDesigner生成的代码不是小部件,因此必须使用其他类作为基础(有关更多信息,请参阅)

考虑到上述情况,框架1和框架2的设计应基于QFrame创建:

frame1.ui


框架
0
0
400
300
框架
第一帧
Qt::AlignCenter
frame2.ui


框架
0
0
400
300
框架
第二帧
Qt::AlignCenter
将.ui转换为.py:

pyuic5 frame1.ui -o frame1_ui.py -x
pyuic5 frame2.ui -o frame2_ui.py -x
pyuic5 mainwindow.ui -o mainwindow_ui.py -x
创建frame1.py和frame2.py:

frame1.py

from PyQt5 import QtWidgets

from mainwindow_ui import Ui_MainWindow
from frame1 import Frame1
from frame2 import Frame2


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.frame1 = Frame1()
        self.frame2 = Frame2()

        self.stackedWidget.addWidget(self.frame1)
        self.stackedWidget.addWidget(self.frame2)

        self.btn1.clicked.connect(self.on_clicked1)
        self.btn2.clicked.connect(self.on_clicked2)

    def on_clicked1(self):
        self.stackedWidget.setCurrentIndex(0)

    def on_clicked2(self):
        self.stackedWidget.setCurrentIndex(1)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
从PyQt5导入QtWidgets
从frame1\u ui导入ui\u框架
类Frame1(qtwidts.QFrame,Ui_Frame):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setupUi(self)
frame2.py

from PyQt5 import QtWidgets

from mainwindow_ui import Ui_MainWindow
from frame1 import Frame1
from frame2 import Frame2


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.frame1 = Frame1()
        self.frame2 = Frame2()

        self.stackedWidget.addWidget(self.frame1)
        self.stackedWidget.addWidget(self.frame2)

        self.btn1.clicked.connect(self.on_clicked1)
        self.btn2.clicked.connect(self.on_clicked2)

    def on_clicked1(self):
        self.stackedWidget.setCurrentIndex(0)

    def on_clicked2(self):
        self.stackedWidget.setCurrentIndex(1)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
从PyQt5导入QtWidgets
从frame2\u ui导入ui\u框架
类Frame2(qtwidts.QFrame,Ui_Frame):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setupUi(self)
您必须创建一个QMainWindow,其中包含您想要显示的QFrame中的任意多个按钮,并建立一个QStackedWidget:

main window.ui


主窗口
0
0
800
600
主窗口
按钮
按钮
Qt::垂直
20
40
0
0
800
26
从.ui转换为.py:

pyuic5 frame1.ui -o frame1_ui.py -x
pyuic5 frame2.ui -o frame2_ui.py -x
pyuic5 mainwindow.ui -o mainwindow_ui.py -x
在main.py中实现逻辑:

main.py

from PyQt5 import QtWidgets

from mainwindow_ui import Ui_MainWindow
from frame1 import Frame1
from frame2 import Frame2


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.frame1 = Frame1()
        self.frame2 = Frame2()

        self.stackedWidget.addWidget(self.frame1)
        self.stackedWidget.addWidget(self.frame2)

        self.btn1.clicked.connect(self.on_clicked1)
        self.btn2.clicked.connect(self.on_clicked2)

    def on_clicked1(self):
        self.stackedWidget.setCurrentIndex(0)

    def on_clicked2(self):
        self.stackedWidget.setCurrentIndex(1)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

我不明白你的问题,你说的替换是什么意思?如果您显示的代码有效,那么它本身就不相关,在哪个代码中它不起作用?您好,如果您看到当前代码。。当我运行它时,会显示第1帧,而不会显示第2帧。当我点击按钮时,框1消失,框2出现。此代码正在运行。但假设我有20帧,那么我必须以类似的方式纠正,我的代码变得不可读。我所看到的是,我是否有可能创建两个python脚本,比如frame1.py和frame2.py。。。。。。第三个是main.py。总的来说,若我点击按钮1,那个么frame1将应用程序