如何在 tkinter 中获取跟踪变量的引用

问题描述 投票:0回答:1

我有一个条目数量可变的 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))
python tkinter callback
1个回答
0
投票

我不确定这是否有帮助,但您可以指定

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
参数。

© www.soinside.com 2019 - 2024. All rights reserved.