我有一个条目数量可变的 tkinter 应用程序,我想检测内容的更改,特别是哪个条目已更改
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()
我可以在 args 中看到我将 StringVar 的名称作为字符串(例如“PY_VAR0”),但是有没有一种更优雅的方法来获取对哪个条目已更改的引用,而不是在此处获取 substr 。
我尝试过这个 lambda 函数,但它当然只显示 row 的当前值
dogs[row].trace_add('write', lambda *args: dog_changed(row, *args))
我不确定这是否有帮助,但您可以指定
name
实例的 StringVar
:
dogs[row] = tk.StringVar(name=f'dog{row}') # you can set this to whatever you likez
哪个打印这个:
('dog0', '', 'write')
('dog1', '', 'write')
('dog2', '', 'write')
您还可以在
Entry
小部件本身上设置事件绑定,例如 '<Key>'
,每当在小部件内按下按键时就会触发。然后你可以从传递的 event
中获取小部件的引用(如果你这样做,你可能甚至不需要 trace
绑定):
# put this in your for loop
entries[row].bind('<Key>', lambda e: print(e.widget))
请注意,您不必在此处使用
lambda
- 您可以将其绑定到函数;该函数只需要接受传入的 event
参数。