Tkinter - Как отследить расширение списка переменных - PullRequest
0 голосов
/ 01 декабря 2018

То, что я пытаюсь сделать, отслеживать, когда какие-либо значения в списке 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 голосов
/ 03 декабря 2018

Простое предложение, измените вашу 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, и она будет вызывать эту функцию при нажатии кнопки, и вы можете избежать привязки щелчка мышью Button1 к вашему Button (Примечание: нет необходимости использовать аргумент event вфункция при использовании, как это).Подробнее здесь
  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()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...