使用参数调用 Tkinter var trace

Calling a Tkinter var trace with arguments

这个代码

from tkinter import *

root = Tk()
test = StringVar()
test.set('')
passarg = 'hello'
test.trace('w', lambda passed = passarg: checkvar(passed))

testEntry = Entry(root, textvariable = test)
testEntry.pack(fill = X)

root.mainloop()
def checkvar(passedarg, *args):
    print(passedarg)

在调用回调时生成 TypeError: (lambda)() takes 1 positional argument but 3 were given,即使我已经在函数定义中使用了 *args

或者,我尝试添加一些假参数以达到 3,但是回调根本没有获得任何传递的参数:

from tkinter import *

def checkvar(passedarg, *args):
    print(passedarg)
    print(args)

root = Tk()
test = StringVar()
test.set('')
passarg = 'hello'
test.trace('w', lambda passed = passarg, a = 1, b = 2: checkvar(passed, a, b))

testEntry = Entry(root, textvariable = test)
testEntry.pack(fill = X)

root.mainloop()

打印

PY_VAR0
('', 'w')

每当我在输入字段中写入时。

需要一个带有参数的回调函数,用于更大的程序,那么有什么办法可以做到吗?

澄清:更大的程序有许多不同最大输入长度的输入字段,所有输入字段都被检查为仅包含 ASCII 字符的子集(使用正则表达式 ^[0-9A-Za-z\.\-\+]+$)。基本的想法是我可以有一个通用的验证函数,它将传递一个 tkintervar(以检查字符)和跟踪中的整数长度,而不是为每个长度限制创建一个单独的函数。

您的 lambda 必须接受参数并将它们传递给您的函数,因为变量更改时调用的是 lambda。使您的代码正常工作的最简单修复方法是将 lambda 更改为:

test.trace('w', lambda *args, passed = passarg: checkvar(passed, *args))

您说您正在使用它进行输入验证。您是否知道条目小部件具有用于条目验证的内置功能?参见 Interactively validating Entry widget content in tkinter