【发布时间】: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