Python 3.x 使用来自线程的tkinter虚拟事件
我想使用虚拟事件从线程更新Tkinter标签Python 3.x 使用来自线程的tkinter虚拟事件,python-3.x,multithreading,tkinter,Python 3.x,Multithreading,Tkinter,我想使用虚拟事件从线程更新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("<<t
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()
当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\u eventA
将线程设置为守护进程会有所帮助。避免生成上述异常,但标签仍未更新。
知道吗?您正在根窗口上生成虚拟事件,而不是标签。您应该调用标签上的
.event\u generate()
:
从tkinter导入*
从tkinter导入ttk
导入线程
导入时间
def运行测试事件(标签):
尽管如此:
label.event_generate(“”)
label.event_generate(“”)
时间。睡眠(1)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
l=ttk.Label(根,text=“开始…”)
l、 网格()
l、 绑定(“”,lambda e:l.configure(text='Moved mouse inside'))
l、 绑定(“”,lambda e:l.configure(text='test\u eventA'))
l、 bind(“”,lambda e:print('test_eventB'))#应在此处使用lambda
#将标签传递给目标函数
threading.Thread(target=run\u test\u事件,args=(l,),daemon=True).start()
root.mainloop()
您正在根窗口而不是标签上生成虚拟事件。您应该调用标签上的.event\u generate()
:
从tkinter导入*
从tkinter导入ttk
导入线程
导入时间
def运行测试事件(标签):
尽管如此:
label.event_generate(“”)
label.event_generate(“”)
时间。睡眠(1)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
l=ttk.Label(根,text=“开始…”)
l、 网格()
l、 绑定(“”,lambda e:l.configure(text='Moved mouse inside'))
l、 绑定(“”,lambda e:l.configure(text='test\u eventA'))
l、 bind(“”,lambda e:print('test_eventB'))#应在此处使用lambda
#将标签传递给目标函数
threading.Thread(target=run\u test\u事件,args=(l,),daemon=True).start()
root.mainloop()
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