在使用 PyQt5 编写的 Python 3.5 应用程序内部,我有如下的 mouseReleaseEvents
self.scene1.mouseReleaseEvent = self.setScene("1")
当它们有变量要传递时,它们都会在应用程序启动时触发,而在实际单击时不会触发。
但是,如果我删除该变量,它们会在按下时起作用,并且不会在应用程序启动时触发:
self.scene1.mouseReleaseEvent = self.setScene
但是我必须将一个变量传递给这个函数
def setScene(self, scene):
print(scene)
关于变量为何导致此行为以及如何修复它有什么建议吗?
最佳答案
可能在每个 GUI 中,当您将函数绑定(bind)到事件时,您必须使用函数名称 - 这意味着没有 ()
和参数。
你可以有两种方法
“boring”:创建不带参数的函数并分配给事件
def new_fun(self): self.setScene("1") self.scene1.mouseReleaseEvent = self.new_fun
“流行”:使用
lambda
创建匿名函数self.scene1.mouseReleaseEvent = lambda:self.setScene("1")
我不知道,但是 mouseReleaseEvent
可能会使用 event
对象运行函数,该对象包含有关事件的信息,因此您必须获取它
self.scene1.mouseReleaseEvent = lambda event:self.setScene("1")
<小时/>
如果您必须在 for x
循环中使用 lambda
并在 lambda
函数中使用 x
那么您需要
for x in some_list:
self.scene1.mouseReleaseEvent = lambda event, arg=x :self.setScene(arg)
因为 lambda
是“惰性”
,并且当您定义 lambda
时,它不会将值从 x
复制到函数中code> 但当您释放鼠标时,它会从 x
获取值 - 但此时 x
具有来自 some_list
的最后一个值。
关于python - mouseReleaseEvent 在应用程序启动时触发,而不是在 PyQt5 中单击时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40392127/