Python PyQt:单击按钮后更改GUI布局

Python PyQt:单击按钮后更改GUI布局,python,pyqt,pyqt4,qmainwindow,Python,Pyqt,Pyqt4,Qmainwindow,好的,我从Tkinter跳到PyQt,因为PyQt更先进,更适合使用。但是我在这里遇到了一些麻烦 我试图在按下主屏幕上的一个按钮后更改GUI布局。我按下主GUI页面的第一个按钮,然后我希望它转到我将创建的另一个GUI页面。我已经在这里坐了好几个小时,试图找到一些方法来做到这一点——YouTube上没有视频,我也没有找到任何有帮助的堆栈溢出页面。所以我知道有一个Qt设计器程序。我不喜欢这样的程序,所以在回答问题时请尽量避免使用 PS:我不想处理多个.py文件,但如果没有其他方法,我想我将不得不这样

好的,我从Tkinter跳到PyQt,因为PyQt更先进,更适合使用。但是我在这里遇到了一些麻烦

我试图在按下主屏幕上的一个按钮后更改GUI布局。我按下主GUI页面的第一个按钮,然后我希望它转到我将创建的另一个GUI页面。我已经在这里坐了好几个小时,试图找到一些方法来做到这一点——YouTube上没有视频,我也没有找到任何有帮助的堆栈溢出页面。所以我知道有一个Qt设计器程序。我不喜欢这样的程序,所以在回答问题时请尽量避免使用

PS:我不想处理多个.py文件,但如果没有其他方法,我想我将不得不这样做

以下是我目前的代码:

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()

我提出的解决方案基于生成Qt Designer的函数
setupUi()
,该函数负责创建窗口的内部元素

import sys

from PyQt4.QtGui import QApplication, QMainWindow, QPushButton, QWidget
#For PyQt5 :
#from PyQt5.QWidgets 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_())
开始:

单击按钮后:

单击另一个按钮后:

更优雅的解决方案:

import sys

from PyQt4.QtGui import QApplication, QMainWindow, QPushButton, QWidget
#For PyQt5 :
#from PyQt5.QWidgets 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_())

你不会改变布局,你会改变窗口。关闭一个窗口,然后打开新窗口。更改布局意味着您只有一个窗口,并且在该窗口中替换小部件。嘿,在类
工具选项卡中,您使用
\uuu init\uu 2(*args)
作为构造函数。但是它仍然和
\uuuu init\uuuu
构造函数一样吗?非常感谢,但是由于某些原因,图标字符串对我不起作用。我尝试过改变它,退出abit,但仍然没有任何东西认为yoiu能帮上忙吗?@Kliffy使用MainWindow.setWindowIcon(QIcon({path of image}))在UIToolTab和UIWindow中,当我这样做时,我得到了这个错误“QWidget.setWindowIcon(QIcon):unbound方法的第一个参数必须具有类型“QWidget”,当我将QWidget添加到行中时,我给出了“类型对象‘MainWindow’没有属性‘QWidget’”,非常感谢@eyllanesc!这个解决方案对我也有帮助。单击按钮后,如何将其更改为显示文本框?