延迟跟踪 Tkinter 变量

Trace Tkinter variable with a delay

我想延迟过滤数据集。

我有这个基本布局:

import tkinter as tk
    
def filter(*args):
   print('entry callback', 'changed %s' % str(args))
   print('limit result set with', filter_input.get())

if __name__ == "__main__":
    master = tk.Tk()
    filter_input = tk.StringVar(value='')  # filter mode
    # filter_input.trace('w', filter)  # simple trace triggers immediately
    # filter_input.trace_variable('w', filter)  # trace_variable as well
    filter_input.trace_add('write', filter)  # trace_add should replace previous (deprecated)
    entry_field = tk.Entry(master, textvariable=filter_input)
    entry_field.pack()
    tk.mainloop()

I started with main Tkinter python page

I went through the main widget documentation

全球有更多文档,但我找不到任何关于实施延迟的提及。任何人都可以帮我找出是否有可能在一段定义的时间后调用过滤器函数?也许另一个包装函数可以提供帮助?

编辑:

看来我需要清除所需的功能。 This is somehow what I am after 但我需要延迟而不是“用户停止输入”activity。

如果您只想延迟调用该函数,请使用 after(ms,func)ms 毫秒后调用该函数。所以你的功能可能是这样的:

def filter(*args):
    # print(f'entry callback changed {str(args)}')
    print(f'limit result set with {filter_input.get()}')
    master.after(1000,filter) # Call this function every 1000 millisecond or 1 second

if __name__ == "__main__":
    master = tk.Tk()
    ....
    
    filter() # Call the function initially
    tk.mainloop()

因此,您也可以在此处删除 StringVar,因为您正在使用 after(),仅此而已。如果你想结束这个 after() 循环,那么使用 after_cancel(id).

编辑:

如果你想在每次打开 window 时看到一次延迟的输入,那么试试这个:

first = True
def show():
    global first
    if first and entry_field.get():
        first = False
        master.after(3000,lambda: print(entry_field.get()))

if __name__ == "__main__":
    master = tk.Tk()

    ......
    entry_field.bind('<Key>',lambda e: show())    

编辑 2:当框被清除并再次输入时,这也会调用该函数:

first = True
def show():
    global first
    if entry_field.get():
        if first:
            first = False
            master.after(3000,lambda: print(entry_field.get()))
    else:
        first = True