我在使用 Tkinter GUI 中的线程类时遇到了问题。在启动 Tkinter GUI 时,我使用守护程序创建新的 Threading & Queue 对象并启动它。在 Tkinter GUI 中,我有一个调用内部方法的按钮。然后此方法调用 Queue 对象上的 put 并在下面发布。Threading 对象执行我期望的所有必要操作。
def my_method_threaded(self, my_name):
try:
self.queue.put(("test", dict(name=my_name)))
self.label_str_var.set('')
self.queue.join()
except:
self.error_out(msg=traceback.format_exc())
但是,我在完成后遇到了一个问题。如果我调用self.queue.join()
,则该set
调用永远不会执行,并且应用程序在线程完成其任务后冻结。如果我注释掉join()
命令,set
调用就会执行,但按钮只会在第一次工作,之后什么都不做(我run()
正在使用记录器跟踪该方法正在做什么。它只在第一次被调用)。
我假设调用 join() 和 Tkinter 循环存在问题,这就是出现第一个问题的原因。任何人都可以对第二个问题有所了解吗?如果您需要更多代码,请告诉我。
编辑:我刚刚注意到的第二个问题是while True
循环执行我的操作两次,即使我已经调用了self.queue.task_done()
. run 方法的代码如下:
def run(self):
args = self._queue.get()
my_name = args[1]["name"]
while True:
if my_name == "Barry":
#calls a static method elsewhere
self.queue.task_done()