在python中如何使用内联循环将func name作为arg发送

2024-10-01 15:33:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个GUI程序,我有两个QCheck小部件,希望将它们都连接到一个函数。使用这样的代码,一切都很好:

widgets = [widget1,widget2]
for widget in widgets:
    self.connect(widget, SIGNAL("clicked()"), self.TheFunction)

我知道这可能是非常懒惰,但它必须是一个这样做的方式在一条线的方式!我知道我可以使用lambda,但是有什么方法可以让它像这样工作吗

self.connect((x for x in (widget1,widget2)), SIGNAL("clicked()"),self.TheFunction)

widget1widget2都是QObject,这就是connect期望看到的。但不管我怎么尝试,它总是告诉我,参数不是QObject


Tags: inself程序forsignalconnect方式gui
3条回答

您可以在一行中编写简单的for循环

for x in (widget1, widget2): self.connect(x, SIGNAL("clicked()"), self.TheFunction)

如果你需要使用列表理解,那么

list(self.connect(x, SIGNAL("clicked()"),self.TheFunction) for x in (widget1,widget2))

或者

[self.connect(x, SIGNAL("clicked()"),self.TheFunction) for x in (widget1,widget2)]

(谢谢让·弗兰ç(法布)

但是你的第三行的第一个版本更具可读性

你的代码已经是最佳的了。好的旧循环有时是最好的,特别是在这里,您不需要对返回值connect做任何事情(不创建生成器函数或列表)

如果你真的想要一条单行线,我建议你:

for widget in [widget1,widget2]: self.connect(widget, SIGNAL("clicked()"), self.TheFunction)

通过使用new-style signal and syntax,并将每个连接放在自己的行上,可以极大地提高代码的可读性:

widget1.clicked.connect(self.TheFunction)
widget2.clicked.connect(self.TheFunction)

我想你也可以这样做一行:

for widget in widget1, widget2: widget.clicked.connect(self.TheFunction)

但对我来说,这看起来不那么可读

相关问题 更多 >

    热门问题