Python 如何用另一个框架替换框架
我有一个需要用另一个框架替换一个框架的要求。我已经实现了下面的代码,这是工作良好,但问题是,我在同一个文件中做。如果我在一个.py文件中创建frame1,在另一个.py文件中创建frame2,并且仍然获得相同的结果,是否可能 下面的解决方案不会有帮助,因为它会在单个文件中创建大量代码Python 如何用另一个框架替换框架,python,pyqt5,Python,Pyqt5,我有一个需要用另一个框架替换一个框架的要求。我已经实现了下面的代码,这是工作良好,但问题是,我在同一个文件中做。如果我在一个.py文件中创建frame1,在另一个.py文件中创建frame2,并且仍然获得相同的结果,是否可能 下面的解决方案不会有帮助,因为它会在单个文件中创建大量代码 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow):
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生成的代码不是小部件,因此必须使用其他类作为基础(有关更多信息,请参阅)
框架
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生成的代码不是小部件,因此必须使用其他类作为基础(有关更多信息,请参阅)
框架
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将应用程序