2017-03-03 19 views
1

私はtkinter noobです。Python + Tkinter、tkフロントエンドとは独立した方法で実行するには?

私のtkinterポップアップ(フォーム?)とは別に、長期実行プロセスをバックグラウンドで実行するにはどうすればよいでしょうか?

tkinterの使用中にマルチスレッドに関するさまざまなことを読んだことがありますが、「これは好きですか?

明確にするには、私が必要とする動作は、ユーザーがプログラムを起動することです。プロセスが開始されたことを示すtkinterビットがポップアップ表示されます。ユーザーは、残りのプロセスに影響を与えることなく、このポップアップを閉じることができます。プロセスが終了したら、別のtkinterポップアップを投げることができます。

これに対して、tkinterが過剰な場合は、より良い方法をお勧めします。

ありがとうございます!

答えて

2

Joranビーズリーは正しい答えが、道overcomplicatedものを持っています。

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

条件ながら:睡眠はかなりアンチパターンです。条件変数は理由のために存在しますが、この場合はjoinも同様です(より大きなguiプログラムでguiスレッドにマーシャリングしたいと思っています) – Voo

+0

良い点....いくつかの状態変数を待ちます。私の仕事のステータスをポーリングする...これは、それが終了するのを待つために残酷です...私は明らかに考えていませんでした:P –

関連する問題