Python 3.x 使用参数调用Tkinter变量跟踪

Python 3.x 使用参数调用Tkinter变量跟踪,python-3.x,tkinter,tkinter-entry,Python 3.x,Tkinter,Tkinter Entry,此代码 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(p

此代码

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)()接受1个位置参数,但调用回调时给出了3个
,即使我已经在函数定义中使用了
*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))

你说你用这个来验证输入。您是否知道条目小部件具有用于条目验证的内置功能?请参见您的
lambda
必须接受参数并将其传递给函数,因为变量更改时调用的是lambda。使代码正常工作的最简单修复方法是将lambda更改为:

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

你说你用这个来验证输入。您是否知道条目小部件具有用于条目验证的内置功能?看

我认为你做不到,但我可能被证明是错的;回调通过tkinter侦听器,该侦听器似乎没有传递参数。你为什么需要args来做这个?您可以为每个变量实现一个回调,并为关键字args指定一个默认值?或者您可以实现自己的变量类,使用一个传递args的pub/sub。@ReblochonMasque我编辑了这篇文章,为我为什么需要它添加了一个说明。我将尝试使用自定义类解决问题。@ReblochonMasque:侦听器正在传递参数。这正是错误的原因:侦听器正在向回调传递三个位置参数,回调(lambda函数)不接受它们。很酷,谢谢@BryanOakley,我学到了一些东西。我不认为你可以,但我可能被证明是错的;回调通过tkinter侦听器,该侦听器似乎没有传递参数。你为什么需要args来做这个?您可以为每个变量实现一个回调,并为关键字args指定一个默认值?或者您可以实现自己的变量类,使用一个传递args的pub/sub。@ReblochonMasque我编辑了这篇文章,为我为什么需要它添加了一个说明。我将尝试使用自定义类解决问题。@ReblochonMasque:侦听器正在传递参数。这正是错误的原因:侦听器正在向回调传递三个位置参数,回调(lambda函数)不接受它们。很酷,谢谢@BryanOakley,我学到了一些东西。谢谢,我知道
validatecommand
,但我觉得它对我自己来说有点太复杂了
.trace()
现在似乎更容易了,不过我会在业余时间尝试使用
validatecommand
重复这个过程。谢谢,我知道
validatecommand
,但我觉得它对我自己来说有点太复杂了
.trace()
现在似乎更容易了,不过我会在业余时间尝试使用
validatecommand
重复这个过程。