Python + Tkinter,如何在独立于tk前端的后台运行?

时间:2017-03-03 22:15:27

标签: python multithreading tkinter

我是tkinter noob。

在后台运行长时间运行的进程的首选方法是什么,与我的tkinter弹出窗口(表单?)分开?

我在使用tkinter时已经阅读了有关多线程的不同内容,并且找不到直截了当的“就是这样做”。

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

如果tkinter对此有些过分,请随时建议更好的方法。

谢谢!

2 个答案:

答案 0 :(得分:3)

Joran Beasley有正确的答案,但过于复杂的事情。这是简单的版本:

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")

答案 1 :(得分:1)

由于您可以共享对象状态

,因此更简单
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")