使用参数调用 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
这个代码
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