PyQt: cambiar el diseño de la GUI después de hacer clic en el botón

Bueno, estoy saltando de Tkinter a PyQt, porque PyQt es mucho más avanzado y más agradable para trabajar. ¡PERO! Estoy teniendo algunos problemas aquí.

Estoy tratando de cambiar el diseño de la GUI después de presionar uno de mis botones en la pantalla principal. Presiono el primer botón de la página principal de la GUI, luego quiero que vaya a otra página de la GUI que crearé. He estado sentado aquí durante horas tratando de encontrar una manera de hacer esto: no hay videos en YouTube, y no he encontrado ninguna página de desbordamiento de stack que ayude. Así que aprendí que hay un progtwig de Qt Designer. No me gustan los progtwigs así, así que trate de evitar usarlos al responder.

PD: no quiero trabajar con más de un archivo .py, pero si no hay otra manera, supongo que tendré que hacerlo.

Aquí está mi código hasta ahora:

class Window(QtGui.QMainWindow): def __init__(self): super(Window, self).__init__() self.setGeometry(50, 50, 400, 450) self.setFixedSize(400,450) self.setWindowTitle(" Tool") self.setWindowIcon(QtGui.QIcon('PhotoIcon.png')) self.home() def home(self): ToolsBTN = QtGui.QPushButton('text', self) ToolsBTN.clicked.connect(ToolTab) ToolsBTN.move(50, 350) CPSBTN = QtGui.QPushButton('text', self) CPSBTN.clicked.connect(QtCore.QCoreApplication.instance().quit) CPSBTN.move(150, 350) CreatorBTN = QtGui.QPushButton('Creator', self) CreatorBTN.clicked.connect(QtCore.QCoreApplication.instance().quit) CreatorBTN.move(250, 350) self.show() class ToolTab(QtGui.QMainWindow): def __init__2(self): super(ToolTab, self).__init__2() self.setGeometry(50, 50, 400, 450) self.setFixedSize(400,450) self.setWindowTitle(" Tool") self.setWindowIcon(QtGui.QIcon('PhotoIcon.png')) self.Toolsgui() def Toolsgui(self): CPSBTN = QtGui.QPushButton('123', self) CPSBTN.clicked.connect(QtCore.QCoreApplication.instance().quit) CPSBTN.move(150, 300) self.show() def Run(): app = QtGui.QApplication(sys.argv) GUI = Window() GUITOOL = ToolTab() sys.exit(app.exec_()) Run() 

    La solución que propongo se basa en la función setupUi() que genera Qt Designer, esta es la responsable de crear los elementos internos de la ventana.

     import sys from PyQt4.QtGui import QApplication, QMainWindow, QPushButton, QWidget class UIWindow(object): def setupUI(self, MainWindow): MainWindow.setGeometry(50, 50, 400, 450) MainWindow.setFixedSize(400, 450) MainWindow.setWindowTitle("UIWindow") self.centralwidget = QWidget(MainWindow) # mainwindow.setWindowIcon(QtGui.QIcon('PhotoIcon.png')) self.ToolsBTN = QPushButton('text', self.centralwidget) self.ToolsBTN.move(50, 350) MainWindow.setCentralWidget(self.centralwidget) class UIToolTab(object): def setupUI(self, MainWindow): MainWindow.setGeometry(50, 50, 400, 450) MainWindow.setFixedSize(400, 450) MainWindow.setWindowTitle("UIToolTab") self.centralwidget = QWidget(MainWindow) self.CPSBTN = QPushButton("text2", self.centralwidget) self.CPSBTN.move(100, 350) MainWindow.setCentralWidget(self.centralwidget) class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.uiWindow = UIWindow() self.uiToolTab = UIToolTab() self.startUIWindow() def startUIToolTab(self): self.uiToolTab.setupUI(self) self.uiToolTab.CPSBTN.clicked.connect(self.startUIWindow) self.show() def startUIWindow(self): self.uiWindow.setupUI(self) self.uiWindow.ToolsBTN.clicked.connect(self.startUIToolTab) self.show() if __name__ == '__main__': app = QApplication(sys.argv) w = MainWindow() sys.exit(app.exec_()) 

    Comienzo:

    introduzca la descripción de la imagen aquí

    Después de hacer clic en el botón:

    introduzca la descripción de la imagen aquí

    Después de hacer clic en otro botón:

    introduzca la descripción de la imagen aquí

    Y una solución más elegante:

     import sys from PyQt4.QtGui import QApplication, QMainWindow, QPushButton, QWidget class UIWindow(QWidget): def __init__(self, parent=None): super(UIWindow, self).__init__(parent) # mainwindow.setWindowIcon(QtGui.QIcon('PhotoIcon.png')) self.ToolsBTN = QPushButton('text', self) self.ToolsBTN.move(50, 350) class UIToolTab(QWidget): def __init__(self, parent=None): super(UIToolTab, self).__init__(parent) self.CPSBTN = QPushButton("text2", self) self.CPSBTN.move(100, 350) class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setGeometry(50, 50, 400, 450) self.setFixedSize(400, 450) self.startUIToolTab() def startUIToolTab(self): self.ToolTab = UIToolTab(self) self.setWindowTitle("UIToolTab") self.setCentralWidget(self.ToolTab) self.ToolTab.CPSBTN.clicked.connect(self.startUIWindow) self.show() def startUIWindow(self): self.Window = UIWindow(self) self.setWindowTitle("UIWindow") self.setCentralWidget(self.Window) self.Window.ToolsBTN.clicked.connect(self.startUIToolTab) self.show() if __name__ == '__main__': app = QApplication(sys.argv) w = MainWindow() sys.exit(app.exec_())