【发布时间】:2016-08-13 19:01:27
【问题描述】:
这是我研究的一个简单代码。来自zetcode.com
你需要 Pyqt5 lib 来执行它:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
ZetCode PyQt5 tutorial
In this example, a QCheckBox widget
is used to toggle the title of a window.
author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""
import sys
from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
from PyQt5.QtCore import Qt
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
cb = QCheckBox('Show title', self)
cb.move(20, 20)
cb.toggle()
cb.stateChanged.connect(self.changeTitle)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('QCheckBox')
self.show()
def changeTitle(self, state):
if state == Qt.Checked:
self.setWindowTitle('QCheckBox')
else:
self.setWindowTitle('')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
我的问题更多是关于类,args 的性质。
如果你看到这部分代码:
cb.stateChanged.connect(self.changeTitle)
很明显它连接到changeTitle函数,但是我们有相同的函数:
def changeTitle(self, state):
开头是:
if state == Qt.Checked:
我的问题是关于状态的。为什么作者添加了 state 以及为什么它充当对象,如果没有在此代码中以任何方式定义。?
如果作者这样做,对我来说是合乎逻辑的:
cb.stateChanged.connect(self.changeTitle(state))
这样就知道有参数需要根据if条件执行。
很想听听您的解释。谢谢。
【问题讨论】:
-
显然
cb.stateChanged.connect采用了一个回调函数,即当cb的状态发生任何变化时都会调用该函数。当调用发生时,一个参数被传递给回调函数,代表新的状态。因此,您传递的方法定义了一个state参数来接收它。如果您确实尝试了cb.stateChanged.connect(self.changeTitle(state)),您将遇到两个问题: 1.state那时没有定义;和 2. 这只会在状态发生任何变化之前调用一次回调。 -
谢谢。是的,它显然很安静:),但是,我们如何从技术上知道这一点?如果我理解正确,对于所有具有回调性质的方法,我们可以在 () 中创建一个参数,它将充当触发器、响应等?
-
你是什么意思“从技术上知道”?阅读文档?源代码?事件回调是 GUI 框架中非常常见的模式。
-
还有你的问题“我们可以在()中创建一个参数,作为触发器、响应等?”对我来说是不可理解的。
-
如果我使用
self.pusbutton.clicked.connect(self.buttonpressed)然后定义方法,我不需要添加任何额外的参数。在这种情况下,我想,这不是回调方法。我只是想知道,你怎么知道哪些self.button选项支持回调,最重要的是,你在哪里检查。谢谢。
标签: class python-3.x methods pyqt5