【问题标题】:Use tkinter virtual event from thread从线程使用 tkinter 虚拟事件
【发布时间】:2021-02-05 09:58:05
【问题描述】:

我想使用虚拟事件从线程更新 Tkinter 标签。

from tkinter import *
from tkinter import ttk
import threading
import time


def run_test_event():
    while True:
        root.event_generate("<<test_eventA>>")
        root.event_generate("<<test_eventB>>")
        time.sleep(1)


if __name__ == '__main__':
    root = Tk()
    l = ttk.Label(root, text="Starting...")
    l.grid()
    l.bind('<Enter>', lambda e: l.configure(text='Moved mouse inside'))
    l.bind('<<test_eventA>>', lambda e: l.configure(text='test_eventA'))
    l.bind('<<test_eventB>>', print('test_eventB'))

    threading.Thread(target=run_test_event).start()
    root.mainloop()

控制台在启动时打印:

test_eventB

当 GUI 关闭时控制台打印:

Exception in thread Thread-1:
Python\Python38\lib\tkinter\__init__.py", line 1849, in event_generate
    self.tk.call(args)
RuntimeError: main thread is not in main loop

标签从不更新且不显示test_eventA

将线程设置为守护进程确实有帮助。它避免生成上述异常,但标签仍然没有更新。 有什么想法吗?

【问题讨论】:

    标签: python-3.x multithreading tkinter


    【解决方案1】:

    您在根窗口而不是标签上生成虚拟事件。你应该打电话给标签上的.event_generate()

    from tkinter import *
    from tkinter import ttk
    import threading
    import time
    
    
    def run_test_event(label):
        while True:
            label.event_generate("<<test_eventA>>")
            label.event_generate("<<test_eventB>>")
            time.sleep(1)
    
    
    if __name__ == '__main__':
        root = Tk()
        l = ttk.Label(root, text="Starting...")
        l.grid()
        l.bind('<Enter>', lambda e: l.configure(text='Moved mouse inside'))
        l.bind('<<test_eventA>>', lambda e: l.configure(text='test_eventA'))
        l.bind('<<test_eventB>>', lambda e: print('test_eventB')) # should use lambda here
    
        # pass label to target function
        threading.Thread(target=run_test_event, args=(l,), daemon=True).start()
        root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 2020-10-19
      • 2011-07-14
      • 1970-01-01
      相关资源
      最近更新 更多