请考虑以下PySide2程序(Python版本3.8.6和PySide2版本5.15.1):
from PySide2.QtWidgets import QApplication, QLineEdit
def setup(w, sigs):
for name, f in sigs:
getattr(w, name).connect(lambda *args: f(*args))
app = QApplication()
win = QLineEdit()
setup(win, [("textChanged", lambda *args: print(" text", args)),
("returnPressed", lambda *args: print("return", args))])
win.show()
app.exec_()
这是当我键入“ asdf”并按Enter时的输出:
return ('a',)
return ('as',)
return ('asd',)
return ('asdf',)
return ()
我希望这是
text ('a',)
text ('as',)
text ('asd',)
text ('asdf',)
return ()
为什么PySide在QLineEdit上连接更高版本的回调函数?如果我将setup
功能更改为
def setup(w, sigs):
for name, f in sigs:
getattr(w, name).connect(f)
它按预期工作。以下内容也适用:
def const(f):
return lambda *args: f(*args)
def setup(w, sigs):
for name, f in sigs:
getattr(w, name).connect(const(f))
这与PySide无关,但与Closures有关。
lambda的作用域位于创建它的函数内,因此,当您在循环中创建多个lambda时,其参数中未引用的任何变量都是该作用域中已知变量的最后一个值。对于您而言,f
始终是列表的最后一个功能。
顺便说一句,在您的情况下,您正在使事情变得比其应有的更复杂:只需连接到该函数,就完全不需要创建另一个lambda了:
def setup(w, sigs):
for name, f in sigs:
getattr(w, name).connect(f)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句