Tkinter-如何跟踪扩展的变量列表

时间:2018-12-01 01:55:20

标签: python-3.x tkinter

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方法将对整个变量列表运行回调,即使该列表已扩展?

1 个答案:

答案 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'))

其他建议:

  1. add = tk.Button(frame,text='add Entry',command='buttonpressed')command选项分配了一个字符串,这意味着它将在单击按钮时尝试执行该字符串(不执行任何操作)。相反,您可以将函数add_entry分配给command选项,单击按钮时它将调用该函数,并且可以避免将Mouse Button1单击绑定到Button(注意:像这样使用时,请在函数中使用参数event。了解更多here
  2. Python支持List的负索引,因此您可以调用L[-1]来检索列表中的最后一个元素,而不用调用L[len(L)-1])
  3. 按照建议更改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()