按钮单击在 Python 中的第二个类/布局中不起作用

Posted

技术标签:

【中文标题】按钮单击在 Python 中的第二个类/布局中不起作用【英文标题】:Button click doesnt work from my second class/layout in Python 【发布时间】:2018-02-13 07:53:20 【问题描述】:

我正在使用 PyQt5,我设计了 3 个布局。

登录 仪表板 设置。

LoginDashboard 页面具有单独的类文件。当我尝试登录时,它会登录。之后,我尝试从dashboard 中单击settings 按钮,但没有任何反应。布局不变。

然而,如果我单独运行dashboard 文件,单击settings 按钮会起作用并且布局会发生变化。我很困惑,为什么会这样。这是我的一段代码:

登录:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from login import Ui_loginWindow
from dashboard import Ui_dashboardWindow

class loginClass(Ui_loginWindow):
    def __init__(self,dialog):
        Ui_loginWindow.__init__(self)
        self.setupUi(dialog)
        self.loginBtn.clicked.connect(self.openDashboard)

    def openDashboard(self):
        self.dashboardWindow = Ui_dashboardWindow()
        self.dashboardWindow.setupUi(loginWindow)
        loginWindow.hide() #works
        loginWindow.show() #works

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    loginWindow = QtWidgets.QMainWindow()
    var = loginClass(loginWindow)
    loginWindow.show()
    sys.exit(app.exec_())

仪表板:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from dashboard import Ui_dashboardWindow
from settings import Ui_settingsWindow

class dashboardClass(Ui_dashboardWindow):
    def __init__(self,dialog):
        Ui_dashboardWindow.__init__(self)
        self.setupUi(dialog)
        self.settingsBtn.clicked.connect(self.openSettings)

    def openSettings(self):
        self.settingsWindow = Ui_settingsWindow()
        self.settingsWindow.setupUi(dashboardWindow)
        dashboardWindow.hide() #doesnot work
        dashboardWindow.show() #doesnot work

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    dashboardWindow = QtWidgets.QMainWindow()
    var = dashboardClass(dashboardWindow)
    dashboardWindow.show()
    sys.exit(app.exec_())

我真正想要的

【问题讨论】:

查看this answer 了解完整的登录对话框示例。 问题是它包含 2 个类的单个文件,而我使用的是 2 个单独的文件和 2 个不同的类。我的问题是:当我运行 login.py 时,页面 login.py(layout 1) 上的按钮 1 起作用,这导致了 dashboard.py 页面(layout 2)。如果我单击按钮 2,则没有任何反应。如何纠正这个问题? 只需重新编写代码以使用我建议的解决方案。如果您需要两个模块,请将一个导入另一个。 可以导入,但是如何将dashboardClass()导入到不同布局的loginClass()?它说:“NameError:名称'dashboardClass'未定义”。我效法了你的榜样。 【参考方案1】:

执行时:

self.dashboardWindow = Ui_dashboardWindow()
self.dashboardWindow.setupUi()

您正在编写自定义类初始化,在其中连接按钮 click -signal - 只需使用:

self.dashboardWindow = dashboardClass()

或手动添加连接:

self.dashboardWindow = Ui_dashboardWindow()
self.dashboardWindow.setupUi()
self.dashboardWindow.settingsBtn.clicked.connect(openDashboard)

跟随这一切:

self.dashboardWindow.show()
self.hide()

请注意,您的命名非常混乱,我无法理解为什么您打开的 DASHBOARD 会隐藏并显示您的 SETTINGS,反之亦然。你可能也会在那里遇到一些问题,但我希望这能解决你的按钮点击问题。


编辑:

这是一个简单的工作示例,其中三个窗口相互调用(重组):

from PyQt5.QtWidgets import *
class LoginWindow( QMainWindow ) :
    def __init__ ( self, parent = None ) :
        super( LoginWindow, self ).__init__( parent )
        self.text = QLineEdit( 'user/password', self )
        self.loginBtn = QPushButton( 'login; dashboard', self )
        self.loginBtn.move( 0, 50 )
        self.loginBtn.clicked.connect( self.openDashboard )

    def openDashboard ( self ) :
        self.dashboard = DashboardWindow( self )
        self.dashboard.show()
        #self.hide()  # optional

class DashboardWindow( QMainWindow ) :
    def __init__ ( self, parent = None ) :
        super( DashboardWindow, self ).__init__( parent )
        self.settingsBtn = QPushButton( "open settings", self )
        self.settingsBtn.clicked.connect( self.openSettings )

    def openSettings ( self ) :
        self.settings = SettingWindow( self )
        self.settings.show()
        #self.hide()  # optional

class SettingWindow( QMainWindow ) :
    def __init__ ( self, parent = None ) :
        super( SettingWindow, self ).__init__( parent )
        self.label = QLabel( 'hi :)\nsettings here', self )

LoginWindow-class 在 main 中被简单地调用:

import sys
if __name__ == "__main__" :
    app = QApplication( sys.argv )
    login = LoginWindow()
    login.show()
    sys.exit( app.exec_() )

如果您使用hide-选项,您可以通过添加类似这样的内容来重新显示上一个窗口(@98​​7654330@-class 内部的示例):

def closeEvent ( self, *args, **kwargs ) :
    self.parent().show()
    super( SettingWindow, self ).closeEvent( *args, **kwargs )

最后,对于一个不切换窗口的解决方案,只使用一个,看看我的答案:Switching between frames without erasing contents of each frame

【讨论】:

我的 openDashboard() 不隐藏/显示设置。那就是问题所在。我从登录到仪表板的第一次转换正在发生,但从仪表板到设置的转换没有发生。你能告诉我为什么或如何做到这一点吗? @amitavadeb:尝试使用类方法:self.dashboardWindow = dashboardClass()。但仍然:在另一个之后使用 hide()show() rigth 似乎并不合理。 好的,但你没有回答为什么我的第一堂课“loginClass”正在工作,而我的第二堂课“dashboardClass”不起作用。如何使它工作?你能告诉我你将如何编写显示/隐藏代码吗? 我做了你让我做的事,没有任何运气。我附上了一张图片。你能告诉我如何做到这一点吗? @amitavadeb 我在答案中添加了一个示例,以及对其他问题的引用

以上是关于按钮单击在 Python 中的第二个类/布局中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的第二个按钮在使用自动布局约束时表现不同?

如何更改从第一个活动单击的按钮上的第二个活动的文本? [科特林]

在第一个应用程序中单击按钮打开我的第二个应用程序[重复]

单个接口控制器中的两个表在 WatchKit 中不起作用

表单操作在 php 中不起作用?

复选框单击事件在数据表的第二页不起作用?