按钮单击在 Python 中的第二个类/布局中不起作用
Posted
技术标签:
【中文标题】按钮单击在 Python 中的第二个类/布局中不起作用【英文标题】:Button click doesnt work from my second class/layout in Python 【发布时间】:2018-02-13 07:53:20 【问题描述】:我正在使用 PyQt5,我设计了 3 个布局。
登录 仪表板 设置。Login
和 Dashboard
页面具有单独的类文件。当我尝试登录时,它会登录。之后,我尝试从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
-选项,您可以通过添加类似这样的内容来重新显示上一个窗口(@987654330@-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 中的第二个类/布局中不起作用的主要内容,如果未能解决你的问题,请参考以下文章