我在使用Tkinter GUI中的线程类时遇到了问题。在启动Tkinter GUI时,我创建了新的Threading&使用守护程序对对象进行排队并启动它。在Tkinter GUI中,我有一个调用内部方法的按钮。然后,此方法调用put on Queue对象并在下面发布。 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()