Python 更改布局-PyQt5中的小部件

Python 更改布局-PyQt5中的小部件,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,这是我第一次试用PyQt5(以前没有用Python创建GUI的经验,但我已经用Python编写了一些程序)。我的问题是单击按钮后更改窗口内容。我已经创建了我的主类: class GUI(QMainWindow): def __init__(self): super().__init__() self.centralWidget = QStackedWidget() self.setCentralWidget(self.centralWid

这是我第一次试用PyQt5(以前没有用Python创建GUI的经验,但我已经用Python编写了一些程序)。我的问题是单击按钮后更改窗口内容。我已经创建了我的主类:

class GUI(QMainWindow):
    def __init__(self):
        super().__init__()

        self.centralWidget = QStackedWidget()
        self.setCentralWidget(self.centralWidget)

        self.psuE3631A = E3631A()
        self.init_gui()

    def init_gui(self):
        self.initGUI = initGUI(self)
        self.setWindowTitle('Control panel - E3631A')
        self.centralWidget.addWidget(self.initGUI)
        self.show()

    def simple_gui(self):
        self.simpleGUI = simpleGUI(self)
        self.setWindowTitle('Control panel - E3631A')
        self.centralWidget.addWidget(self.simpleGUI)
        self.centralWidget.setCurrentWidget(self.simpleGUI)
        self.show()

    def advanced_gui(self):
        pass

    def close_window(self):
        print_comment("Exit application")
        self.close()
我正在尝试切换initGUI和simpleGUI

simpleGUI:

class simpleGUI(QWidget):
    def __init__(self, parent=None):
        super(simpleGUI, self).__init__(parent)

        print_comment("GUI in simple mode!")

        layout = QGridLayout()
        btn_close = QPushButton("&Exit app", self)
        btn_close.clicked.connect(self.parent().close_window)

        layout.addWidget(btn_close, 0, 1)
        layout.addWidget(btn_close, 1, 1)
        layout.addWidget(btn_close, 2, 0)
        layout.addWidget(btn_close, 2, 2)
        self.setLayout(layout)
class initGUI(QWidget):
    def __init__(self, parent=None):
        super(initGUI, self).__init__(parent)

        self.psuE3631A = self.parent().psuE3631A

        print_comment("GUI initialize mode!")
        layout = QGridLayout()
        self.ComboBoxPorts = QComboBox(self)
        self.ComboBoxPorts.setToolTip("Select port to connect with device - only psu E3631A will be connected!")
        self.init_comboBoxPorts()
        self.scan_ports()

        lbl_version = QLabel("ver " + VERSION)
        lbl_version.setAlignment(Qt.AlignRight)
        btn_refresh = QPushButton("&Refresh ports", self)
        btn_refresh.clicked.connect(self.refresh_port_list)
        self.btn_connect = QPushButton("&Connect", self)
        self.btn_connect.clicked.connect(self.connect_to_device)
        btn_close = QPushButton("&Exit app", self)
        btn_close.clicked.connect(self.parent().close_window)
        if USER is "ADVANCED":
            cb_preselect = QCheckBox("Preselect")
            cb_preselect.stateChanged.connect(self.check_preselect)
            layout.addWidget(cb_preselect, 3, 0)

        layout.addWidget(lbl_version, 1, 2)
        layout.addWidget(self.ComboBoxPorts, 2, 0)
        layout.addWidget(btn_refresh, 2, 1)
        layout.addWidget(self.btn_connect, 2, 2)
        layout.addWidget(btn_close, 3, 2)

        self.setLayout(layout)
initGUI:

class simpleGUI(QWidget):
    def __init__(self, parent=None):
        super(simpleGUI, self).__init__(parent)

        print_comment("GUI in simple mode!")

        layout = QGridLayout()
        btn_close = QPushButton("&Exit app", self)
        btn_close.clicked.connect(self.parent().close_window)

        layout.addWidget(btn_close, 0, 1)
        layout.addWidget(btn_close, 1, 1)
        layout.addWidget(btn_close, 2, 0)
        layout.addWidget(btn_close, 2, 2)
        self.setLayout(layout)
class initGUI(QWidget):
    def __init__(self, parent=None):
        super(initGUI, self).__init__(parent)

        self.psuE3631A = self.parent().psuE3631A

        print_comment("GUI initialize mode!")
        layout = QGridLayout()
        self.ComboBoxPorts = QComboBox(self)
        self.ComboBoxPorts.setToolTip("Select port to connect with device - only psu E3631A will be connected!")
        self.init_comboBoxPorts()
        self.scan_ports()

        lbl_version = QLabel("ver " + VERSION)
        lbl_version.setAlignment(Qt.AlignRight)
        btn_refresh = QPushButton("&Refresh ports", self)
        btn_refresh.clicked.connect(self.refresh_port_list)
        self.btn_connect = QPushButton("&Connect", self)
        self.btn_connect.clicked.connect(self.connect_to_device)
        btn_close = QPushButton("&Exit app", self)
        btn_close.clicked.connect(self.parent().close_window)
        if USER is "ADVANCED":
            cb_preselect = QCheckBox("Preselect")
            cb_preselect.stateChanged.connect(self.check_preselect)
            layout.addWidget(cb_preselect, 3, 0)

        layout.addWidget(lbl_version, 1, 2)
        layout.addWidget(self.ComboBoxPorts, 2, 0)
        layout.addWidget(btn_refresh, 2, 1)
        layout.addWidget(self.btn_connect, 2, 2)
        layout.addWidget(btn_close, 3, 2)

        self.setLayout(layout)
我不确定上面的代码格式是否正确,因此这里有一个直接链接到我的(还有其余的函数和文件)

这就是我得到的:


我做错了什么,在simpleGUI中,只有一个按钮,但它没有处于正确的位置?我是否正确使用了
QStackedWidget()
?我想这是我的问题,但经过多次尝试,我不知道如何解决这个问题

您的代码示例中的缩进不正确。我认为它们是正确的,但我无法在stackoverflow上正确格式化-对此表示抱歉。这个代码正在运行,为什么你不能呢?缩进是python的关键。我们只能看我们所看到的。在simpleGUI中,您所做的错误是使用同一对象多次调用
addWidget
函数
btn\u close
。Qt只考虑您的第一次呼叫,忽略所有后续呼叫(因此按钮位于位置
0,1
)。如果希望GUI中有多个按钮,则需要多个
QPushButton
类的实例。未正确使用
QStackedWidget
。在
GUI中添加所需的所有小部件。然后只调用
init\u gui
simple\u gui
函数中的
setCurrentIndex
setCurrentWidget
。代码示例中的缩进不正确。我认为它们是正确的,但我无法在stackoverflow上正确格式化它-对此表示抱歉。这个代码正在运行,为什么你不能呢?缩进是python的关键。我们只能看我们所看到的。在simpleGUI中,您所做的错误是使用同一对象多次调用
addWidget
函数
btn\u close
。Qt只考虑您的第一次呼叫,忽略所有后续呼叫(因此按钮位于位置
0,1
)。如果希望GUI中有多个按钮,则需要多个
QPushButton
类的实例。未正确使用
QStackedWidget
。在
GUI中添加所需的所有小部件。然后只调用
init_gui
simple_gui
函数中的
setCurrentIndex
setCurrentWidget