【发布时间】:2021-10-05 10:40:20
【问题描述】:
我正在尝试从主函数处理线程中的一些数据。我在修改一些变量时面临的问题,这些变量是在线程上运行的函数的一部分。
所以我试图在线程中运行基于 Tkinter 的 GUI 循环,以确保它始终运行。并且想在main函数执行中修改一些状态对应的标签。我面临一个问题,它无法在主循环中找到标签变量,因为它是在线程上运行的函数的一部分。
下面是该方法的简化伪代码。请建议这是否是完成上述任务的正确方法,或者是否有更好更有效的方法。
import threading
def thread_func():
i = 0
while True:
print('i from thread: ', i)
if __name__ == '__main__':
t = threading.Thread(target=thread_func)
t.start()
while True:
i += 1
实际缩小的简化代码
import threading
import tkinter as tk
def gui():
window = tk.Tk()
label = tk.Label(text='On')
label.pack()
window.mainloop()
if __name__ == '__main__':
t = threading.Thread(target=gui)
t.start()
while True:
label['text'] = 'Active'
错误:
Traceback (most recent call last):
File "test.py", line 17, in <module>
label['text'] = 'Active'
NameError: name 'label' is not defined
有没有更好的方法让 tkinter gui 始终打开并在循环中执行某些任务?
【问题讨论】:
-
你的代码能解决你的问题吗?
-
代码不起作用,因为它给我一个错误,更新问题中的错误并修复导入库名称
-
可以使用
global关键字(不推荐),或者创建一个类并在__init __函数中声明label:self.label = tk.Label (text = 'on') -
@Deep 在使用
tkinter时不要使用线程,除非您知道风险。当从多个线程使用tkinter时,我已经看到tkinter崩溃python(没有回溯)。查看.after脚本以安排对您的函数的调用。 -
@Deep 使用
.after脚本。查看here 的示例,其中我实现了tkinter友好循环。
标签: python multithreading tkinter