【问题标题】:Switching between windows PyQt4 Python 3.5在 Windows PyQt4 Python 3.5 之间切换
【发布时间】:2017-06-10 14:40:55
【问题描述】:

我已经从其他线程查看了针对这些问题的多种解决方案,但我尝试的所有方法都没有奏效。我正在尝试打开所有框架并在它们之间简单地切换,就像你可以在 tkinter 中做的那样。

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

我还没有创建任何其他窗口。

任何帮助将不胜感激。

【问题讨论】:

  • 到目前为止,您对 pyqt4 进行了哪些尝试?请发布您的代码
  • @PYPL 你去!

标签: python pyqt pyqt4 python-3.5


【解决方案1】:

注意:用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_())

【讨论】:

  • 完美!信不信由你,无需调整即可更改为 python 3.5。
猜你喜欢
  • 2016-04-13
  • 2017-03-13
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多