Tenho um aplicativo tkinter com número variável de entradas e quero detectar alterações no conteúdo e, especificamente, qual entrada foi alterada
import tkinter as tk
from tkinter import ttk
DOGS = 3
def main() -> None:
root = tk.Tk()
root.title('')
root.geometry('400x400')
dogs = {}
entries = {}
for row in range(DOGS):
dogs[row] = tk.StringVar()
dogs[row].trace_add('write', dog_changed)
entries[row] = ttk.Entry(root, textvariable=dogs[row])
entries[row].grid(row=row, column=0)
root.mainloop()
def dog_changed(*args):
print(args)
if __name__ == '__main__':
main()
Posso ver em args que tenho o nome da StringVar como uma string (por exemplo, "PY_VAR0"), mas existe uma maneira mais elegante de obter uma referência à entrada que foi alterada em vez de usar uma substr aqui?
Eu tentei esta função lambda, mas é claro que ela só mostra o valor atual da linha
dogs[row].trace_add('write', lambda *args: dog_changed(row, *args))
Não tenho certeza se isso ajuda, mas você pode especificar
name
suasStringVar
instâncias:Que imprime isto:
Você também pode definir uma vinculação de evento nos
Entry
próprios widgets, como'<Key>'
que será acionado sempre que uma tecla for pressionada dentro do widget. Então você pode obter a referência do widget do passadoevent
(você provavelmente nem precisa datrace
vinculação se fizer dessa forma):Observe que você não precisa usar
lambda
here - você pode vincular this a uma função; essa função só precisa aceitar oevent
parâmetro de entrada.