PySide2调用错误的回调函数

伊恩·刘·罗德里格斯(Ian Liu Rodrigues)

请考虑以下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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章