Python 如何使用tkinter中的trace()在回调函数中传递字符串变量

Python 如何使用tkinter中的trace()在回调函数中传递字符串变量,python,tkinter,Python,Tkinter,我是python新手,尝试创建两个输入小部件,以便在用户输入输入框后立即对数据进行评估。如何将字符串var传递到函数回调中,以便它准确返回已更改的输入框。现在回调函数只返回第一个输入框(entry1) 这是我的密码: import tkinter from tkinter import StringVar main_wd = tkinter.Tk() my_var1 = StringVar() my_var2 = StringVar() def my_callback(var): p

我是python新手,尝试创建两个输入小部件,以便在用户输入输入框后立即对数据进行评估。如何将字符串
var
传递到函数回调中,以便它准确返回已更改的输入框。现在回调函数只返回第一个输入框(
entry1

这是我的密码:

import tkinter
from tkinter import StringVar

main_wd = tkinter.Tk()
my_var1 = StringVar()
my_var2 = StringVar()

def my_callback(var):
    print("Traced variables {}".format(var.get())

my_var1.trace('write', my_callback(my_var1))
my_var2.trace('write', my_callback(my_var2))
entry1 = tkinter.Entry(main_wd, textvariable = my_var1).pack(padx = 5, pady = 5)
entry2 = tkinter.Entry(main_wd, textvariable = my_var2).pack(padx = 5, pady = 5)

main_wd.mainloop() 

要使用,
trace
的用法是错误的,也就是说,传递的位置参数是错误的,它必须是
'w'
而不是
'write'
。然后在使用
()
时调用函数,因此需要使用
lambda
。因此,您的
trace
如下所示:

my_var1.trace('w', lambda *_,var=my_var1: my_callback(*_,var=var)) #*_ are the other arguments, like varname,value,mode ?
my_var2.trace('w', lambda *_,var=my_var2: my_callback(*_,var=var))
def my_callback(*args,var):
    print("Traced variables {}".format(var.get()))
那么您的函数将类似于:

my_var1.trace('w', lambda *_,var=my_var1: my_callback(*_,var=var)) #*_ are the other arguments, like varname,value,mode ?
my_var2.trace('w', lambda *_,var=my_var2: my_callback(*_,var=var))
def my_callback(*args,var):
    print("Traced variables {}".format(var.get()))
提示:
entry1
entry2
最好不要是
None
,所以说:

entry1 = tkinter.Entry(main_wd, textvariable = my_var1)
entry1.pack(padx = 5, pady = 5)

entry2 = tkinter.Entry(main_wd, textvariable = my_var2)
entry2.pack(padx = 5, pady = 5)
当在声明的同一行上说
pack()
时,它将返回最后一个方法返回的内容。在这种情况下,
pack()
返回
None
。因此,为了使这些条目小部件可重用,
pack()
。这同样适用于
grid()
place()

最终代码:

import tkinter
from tkinter import StringVar

main_wd = tkinter.Tk()
my_var1 = StringVar()
my_var2 = StringVar()

def my_callback(*args,var):
    print("Traced variables {}".format(var.get()))
    
my_var1.trace('w', lambda *_,var=my_var1: my_callback(*_,var=var))
my_var2.trace('w', lambda *_,var=my_var2: my_callback(*_,var=var))

entry1 = tkinter.Entry(main_wd, textvariable = my_var1)
entry1.pack(padx = 5, pady = 5)

entry2 = tkinter.Entry(main_wd, textvariable = my_var2)
entry2.pack(padx = 5, pady = 5)

main_wd.mainloop() 

您忘记关闭第9行的
my_var1.trace('write',my_callback(my_var1))应该是
my_var1.trace('w',my_callback(my_var1))
与另一个相同。但单凭这一点无法解决问题。看一看谢谢你的回复。但是sameI仍然在my_var1.trace('w',lambda,var=my_var1:my_回调(u,var=var))@VanN您忘记了我放在那里的
*
,但它不应该给出任何无效语法错误,除非您忘记了
或其他东西。请尝试复制粘贴并在我更新的答案中运行整个代码。@VanN~希望您能将此标记为正确答案。单击查看如何标记为答案。因此,我得到了另一个需要解决的问题。假设我有4个输入框,用户在其中输入数据。我使用跟踪函数来评估数据是否有效。这个问题解决了。我用键绑定输入框,我希望在填写entry1后,用户按Tab键移动到下一个框。entry1中的数据将根据专门为输入框设置的最小值和最大值进行检查。如果全部通过,则数据将发送到数据库。如何确定按下Tab键后的数据属于哪个输入框,导致按下Tab键后的用户可以返回编辑数据。@VanN如果您发布答案,您会得到更好的答案,因为在注释中很难解释和理解