StringVar
列表中的任何值发生更改时,即使列表正在扩展,我尝试执行的操作也要跟踪。 trace
语句之前在列表中进行的任何添加都会导致回调。但是之后进行的任何添加(例如按下按钮时)都不会引起任何回调。
import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root)
frame.grid(row=0)
L = []
def add_entry(event):
L.append(tk.StringVar())
tk.Entry(frame,textvariable=L[len(L)-1]).grid(row=len(L),padx=(10,10),pady=(5,5))
add = tk.Button(frame,text='add Entry',command='buttonpressed')
add.grid(row=0)
add.bind('<Button-1>',add_entry)
for i in range(2):
L.append(tk.StringVar())
tk.Entry(frame,textvariable=L[len(L)-1]).grid(row=len(L),padx=(10,10),pady=(5,5))
for i in L:
i.trace('w',lambda *arg:print('Modified'))
root.mainloop()
修改前两个Entry
的打印内容Modified
,但是运行Entry
之后的任何trace
的内容,例如按钮被按下时产生的内容。按下,不会。
如何做到这一点,以使trace
方法将对整个变量列表运行回调,即使该列表已扩展?
答案 0 :(得分:0)
简单建议,将您的add_entry
函数更改为以下内容:
def add_entry(event):
L.append(tk.StringVar())
tk.Entry(frame,textvariable=L[len(L)-1]).grid(row=len(L),padx=(10,10),pady=(5,5))
L[len(L)-1].trace('w',lambda *arg:print('Modified'))
其他建议:
add = tk.Button(frame,text='add Entry',command='buttonpressed')
为command
选项分配了一个字符串,这意味着它将在单击按钮时尝试执行该字符串(不执行任何操作)。相反,您可以将函数add_entry
分配给command
选项,单击按钮时它将调用该函数,并且可以避免将Mouse Button1单击绑定到Button
(注意:像这样使用时,请在函数中使用参数event
。了解更多here List
的负索引,因此您可以调用L[-1]
来检索列表中的最后一个元素,而不用调用L[len(L)-1])
。按照建议更改add_entry
函数后,可以将代码缩减为
import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root)
frame.grid(row=0)
L = []
def add_entry():
global L
L.append(tk.StringVar())
tk.Entry(frame,textvariable=L[-1]).grid(row=len(L),padx=(10,10),pady=(5,5))
L[-1].trace('w',lambda *arg:print('Modified'))
add = tk.Button(frame,text='add Entry',command=add_entry)
add.grid(row=0)
for i in range(2):
add_entry()
root.mainloop()