2017-01-25 6 views
0

Я рассмотрел несколько решений из других потоков для этих проблем, но все, что я пытался, не сработало. Я пытаюсь открыть все фреймы и просто переключаться между ними, как вы можете сделать в tkinter.Переключение между окнами PyQt4 Python 3.5

Tkinter Код:

#Location Of All Frames 
    Container = tk.Frame(self) 
    Container.pack(side="top", fill="both", expand=True) 
    Container.grid_rowconfigure(0, weight=1) 
    Container.grid_columnconfigure(0, weight=1) 
    self.Container = Container 

    #Loop To Select Frames 
    self.Frames = {} 
    for F in (Login, Admin, User): 
     PageName = F.__name__ 
     Frame = F(parent=Container, controller=self) 
     self.Frames[PageName] = Frame 

     #Allign Frame 
     Frame.grid(row=0, column=0, sticky="nsew") 

    #Call Function Show Frame 
    self.show_frame(Login) 

#Function To Call When Switching Frame 
def show_frame(self, PageName): 
    #If Instance Not Created, Create Instance 
    if PageName not in self.Frames: 
     self.Frames[PageName] = PageName(self.Container, self) 
    Frame = self.Frames[PageName] 
    Frame.tkraise() 

Я пытаюсь воссоздать это для PyQt4, но до сих пор не увенчались успехом. Что я пытаюсь сделать.

Начните с страницы входа. Вход (QtGui.QWidget) И затем после входа в систему, нажмите кнопку. Переключитесь в следующее окно. У программы будет много разных макетов, которые необходимо переключить между ними.

Текущий код:

class Application(QtGui.QMainWindow): #This was a solution from someone else that doesn't seem to work 
    def __init__(self, parent=None): 
     super(Application).__init__(parent) 
     self.central_widget = QtGui.QStackedWidget() 
     self.setCentralWidget(self.central_widget) 
     login_widget = LoginWidget(self) 
     login_widget.button.clicked.connect(self.Login) 
     self.central_widget.addWidget(login_widget) 

    def Login(self): 
     logged_in_widget = Admin(self) 
     self.central_widget.addWidget(logged_in_widget) 
     self.central_widget.setCurrentWidget(logged_in_widget) 

Этот метод я также вижу, как неэффективные для большого количества страниц.

class LoginWidget(QtGui.QWidget): 
    def __init__(self): 
     super(Application, self).__init__() 
     self.initUI() #Call Initialize UI function 

    def initUI(self): 
     self.showFullScreen() 
     (...) 

    class Admin(QtGui.QWidget): 
    def __init__(self): 
     super(Application, self).__init__() 
     self.initUI() #Call Initialize UI function 

    def initUI(self): 
     self.showFullScreen() 
     (...) 

Я еще не создал никаких других окон.

Любая помощь будет оценена по достоинству.

+0

что вы пробовали до сих пор с pyqt4 ?? отправьте свой код – PYPL

+0

@PYPL Там вы идете! – Jake

ответ

0

Примечание: написано с py2.7 может потребоваться корректировки для py3.5

Вот решение, где вы используете QStackedWidget, хотя я бы рекомендовал внезапная создать отдельные диалоги, так как положить все в одном виджете, возможно подтормаживать программа

from PyQt4 import QtGui, QtCore 
import sys 

class StackedWidget(object): 
    def setupUi(self, Dialog): 
     Dialog.resize(400, 121) 
     self.page = QtGui.QWidget() 
     self.stackedWidget = QtGui.QStackedWidget(Dialog) 
     self.verticalLayout_3 = QtGui.QVBoxLayout(Dialog) 
     self.verticalLayout = QtGui.QVBoxLayout() 
     self.verticalLayout_4 = QtGui.QVBoxLayout(self.page) 
     self.lineEdit = QtGui.QLineEdit(self.page) 
     self.verticalLayout_4.addWidget(self.lineEdit) 
     self.lineEdit_2 = QtGui.QLineEdit(self.page) 
     self.verticalLayout_4.addWidget(self.lineEdit_2) 
     self.pushButton = QtGui.QPushButton(self.page) 
     self.verticalLayout_4.addWidget(self.pushButton) 
     self.stackedWidget.addWidget(self.page) 
     self.page_2 = QtGui.QWidget() 
     self.verticalLayout_6 = QtGui.QVBoxLayout(self.page_2) 
     self.radioButton_2 = QtGui.QRadioButton(self.page_2) 
     self.verticalLayout_6.addWidget(self.radioButton_2) 
     self.radioButton = QtGui.QRadioButton(self.page_2) 
     self.verticalLayout_6.addWidget(self.radioButton) 
     self.stackedWidget.addWidget(self.page_2) 
     self.verticalLayout.addWidget(self.stackedWidget) 
     self.verticalLayout_3.addLayout(self.verticalLayout) 
     self.stackedWidget.setCurrentIndex(0) 

     self.lineEdit.setPlaceholderText("Login") 
     self.lineEdit_2.setPlaceholderText("Password") 
     self.pushButton.setText("Sign-In") 
     self.radioButton.setText("RadioButton") 
     self.radioButton_2.setText("RadioButton") 

class MultiFrameWidget(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.ui = StackedWidget() 
     self.ui.setupUi(self) 
     self.ui.pushButton.clicked.connect(self.signin) 

    def signin(self): 
     self.ui.stackedWidget.setCurrentIndex(int(self.ui.stackedWidget.currentIndex())+1) 

app = QtGui.QApplication(sys.argv) 
widget = MultiFrameWidget() 
widget.show() 
sys.exit(app.exec_()) 
+0

Отлично! Верьте или нет, никаких изменений не требуется для изменения на python 3.5. – Jake

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