2

我在使用 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()
4

0 回答 0