2016-12-22 2 views
2

Хорошо, я перескакиваю с Tkinter на PyQt, потому что PyQt просто намного более продвинут и работает лучше. НО! У меня здесь проблемы.PyQt: изменить макет GUI после нажатия кнопки

Я пытаюсь изменить макет графического интерфейса после нажатия одной из моих кнопок на главном экране. Я нажимаю первую кнопку на главной странице GUI, а затем хочу, чтобы она перешла на другую страницу GUI, которую я создам. Я часами сижу здесь, пытаясь найти способ сделать это - никаких видеороликов на YouTube, и я не нашел ни одной страницы переполнения стека, которая поможет. Поэтому я узнал, что есть программа Qt Designer. Мне не нравятся такие программы, поэтому, пожалуйста, старайтесь держаться подальше от использования этого при ответе.

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

вы не изменить расположение - изменение окна. Вы закрываете одно окно и открываете новое окно. Изменение макета означает, что у вас есть только одно окно, и вы заменяете виджеты внутри этого окна. – furas

ответ

4

Решение, которое я предлагаю на основе функции setupUi(), который генерирует Qt Designer, это отвечает за создание внутренних элементов окна.

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

Начало:

enter image description here

После нажатия щелкнул:

enter image description here

После нажатия другой кнопки:

enter image description here

и более элегантное решение:

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_()) 
+0

Огромное вам спасибо, но по какой-то причине строка значка не работает для меня, я попытался изменить ее вокруг quit abit, но все же ничего не думаю, что yoiu может помочь там агиан? – Tyrell

+0

@Kliffy Использовать MainWindow.setWindowIcon (QIcon ({путь изображения))) в UIToolTab и UIWindow – eyllanesc

+0

Когда я делаю это, я получаю эту ошибку «QWidget.setWindowIcon (QIcon): первый аргумент метода unbound должен иметь тип« QWidget »» и когда я добавляю Qwidget в строку im, даю «объект типа« MainWindow »не имеет атрибута« QWidget »« – Tyrell

Смежные вопросы