我刚开始使用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()
发布于 2020-11-18 19:56:40
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()))
提示:最好是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()
https://stackoverflow.com/questions/64894998
复制相似问题