【问题标题】:Python+Tkinter, how to run in background independant of tk frontend?Python + Tkinter,如何在独立于tk前端的后台运行?
【发布时间】:2017-03-03 22:15:26
【问题描述】:

我是一个 tkinter 菜鸟。

除了我的 tkinter 弹出窗口(表单?)之外,在后台运行长时间运行的进程的首选方式是什么?

我在使用 tkinter 时阅读了有关多线程的不同内容,但找不到直接的“这样做”。

要清楚,我需要的行为是,用户启动程序,弹出 tkinter 位说进程已经启动。用户可以在不影响其余进程的情况下关闭此弹出窗口。也许当这个过程完成后,我可以抛出另一个 tkinter 弹出窗口。

如果 tkinter 对此太过分了,请随时提出更好的方法。

谢谢!

【问题讨论】:

    标签: python multithreading tkinter


    【解决方案1】:

    Joran Beasley 拥有正确的 answer,但事情过于复杂。

    这是简单的版本:

    class Worker(threading.Thread):
        def run(self):
            # long process goes here
    
    w = Worker()
    w.start()
    tkMessageBox.showinfo("Work Started", "OK started working")
    w.join()
    tkMessageBox.showinfo("Work Complete", "OK Done")
    

    编辑:这是一个工作示例:

    import threading
    import time
    import tkMessageBox
    import Tkinter as tk
    root = tk.Tk()
    root.withdraw()
    
    class Worker(threading.Thread):
        def run(self):
            # long process goes here
            time.sleep(10)
    
    w = Worker()
    w.start()
    tkMessageBox.showinfo("Work Started", "OK started working")
    root.update()
    w.join()
    tkMessageBox.showinfo("Work Complete", "OK Done")
    

    【讨论】:

      【解决方案2】:

      标题更简单,因为您可以共享对象状态

      class Worker:
          finished = False
          def do_work(self):
             os.system("...")
             self.finished=True
          def start(self):
              self.th = threading.Thread(target=self.do_work)
              self.th.start()
      
      w = Worker()
      w.start()
      tkMessageBox.showinfo("Work Started", "OK started working")
      while not w.finished:
          time.sleep(0.5)
      tkMessageBox.showinfo("Work Complete", "OK Done")
      

      【讨论】:

      • while 条件:睡眠几乎是一种反模式。条件变量的存在是有原因的,尽管在这种情况下 join 也可以(在更大的 gui 程序中,您希望编组到 gui 线程)
      • 好点......我经常等待一些状态变量,我正在轮询我的任务状态......这只是等待它退出......我显然没有想到:P
      猜你喜欢
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多