2017-03-03 240 views
1

我是tkinter noob。Python + Tkinter,如何在后台独立运行tk前端?

什么是在后台运行长时间运行的进程的首选方式,与我的tkinter popup(窗体?)分开?

我在使用tkinter的同时阅读了有关多线程的不同内容,但无法找到一个简单的“像这样做”。

要清楚,我需要的行为是,用户启动程序,tkinter位弹出说过程已经开始。用户可以关闭此弹出窗口而不影响其他进程。也许当这个过程结束后,我可以抛出另一个tkinter弹出窗口。

如果tkinter对此过度杀伤,请随时提出更好的方法。

谢谢!

回答

2

Joran比斯利有正确的答案,但过于复杂的方式事情。下面是简单的版本:

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

这真棒,正是我想要的,谢谢! – lsp

0

theading是简单,因为你可以分享对象的状态

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

而条件:睡眠是相当多的反模式。条件变量的存在是有原因的,虽然在这种情况下连接也会同样如此(在一个更大的gui程序中,你想要编组到gui线程) – Voo

+0

好点....我经常等待一些状态变量,即时消息投票我的任务状态...这是矫枉过正,只是等待它退出......我显然没有想到:P –