2017-03-03 45 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 –