2017-08-08 4 views
1

いくつかのプロセスのために新しいトップレベルウィンドウでpython 3で不確定な進行状況バーを作成しようとしています。そのプロセスのスレッド。私が望むのは、プログレスバーが始まり、スレッドもバックグラウンドで起動され、スレッドの実行が完了するとすぐに、タスクが完了したというメッセージが表示されます。スレッドをバックグラウンドでバックグラウンドで開始し、スレッドを開始し、スレッドがPythonで完了した後で再び操作を行う方法

コード:thread1.join()が呼び出された場合

class myThread(threading.Thread): 
    def __init__(self, threadID): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 


    def run(self): 
     print("Starting the thread") 
     func() 
     print("Ending the thread") 

def func(): 
    some task 

... 
new_top = Toplevel() 
new_top.title("New Top Level") 
new_top.geometry("400x170") 

label = Label(new_top, text='Doing some work', justify=CENTER, bg="#CBFDCB").place(x=43,y=30) 

progress_bar = ttk.Progressbar(new_top, orient="horizontal", mode="indeterminate", takefocus=True, length=320) 
progress_bar.place(x=40, y=80) 
progress_bar.start() 

thread1 = myThread(1) 
thread1.start() 
thread1.join() 

... 

実行後のスレッド操作

は私の問題は何ですか、ラベルやプログレスバーを持つトップレベルのウィンドウが表示されませんし、私はこれをスキップした場合スレッド実行後の操作​​は実行されません

答えて

0

Tkinterでスレッディングを行うのはちょっと難しいことがあります。あなたが望むことをするコードがいくつかあります。スレッドの.runメソッドの中からTkinterウィンドウを破壊しようとしたため、私の最初のバージョンが正しく動作しませんでした。それはうまくいかなかった:ウィンドウが閉じたが、呼び出し後に.runメソッドが進まなかった。これで、スレッドがまだ生存しているかどうかを100ミリ秒ごとにチェックする機能があり、生存していない場合はTkinterウィンドウを閉じます。

import threading 
import tkinter as tk 
from tkinter import ttk 
from time import sleep 

class myThread(threading.Thread): 
    def __init__(self, threadID): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 

    def run(self): 
     print("Starting the thread") 
     func() 
     print("Ending the thread") 

def func(): 
    for i in range(10): 
     print(i) 
     sleep(1) 

def check_thread(th): 
    if not th.isAlive(): 
     root.destroy() 
    root.after(100, check_thread, th) 

root = tk.Tk() 
root.title("New Top Level") 
root.geometry("400x170") 

tk.Label(root, text='Doing some work', justify=tk.CENTER, bg="#CBFDCB").place(x=43, y=30) 
progress_bar = ttk.Progressbar(root, orient="horizontal", 
    mode="indeterminate", takefocus=True, length=320) 
progress_bar.place(x=40, y=80) 
progress_bar.start() 

thread1 = myThread(1) 
thread1.start() 
root.after(100, check_thread, thread1) 
root.mainloop() 

print("Doing post-thread stuff") 
0

TKinterは無限のメインループを使用してイベントを待って処理します - プレスを傍受したり、要素を再描画したりします(詳細はhereをご覧ください)。

join()に電話をかけたときは、新たに起動したスレッドの実行が終了するまでメインスレッド(tkinterが実行される)が強​​制的に実行されるため、進行状況バーでトップレベルウィンドウを描画できません。したがって、これは実際には選択肢ではありません。

一方、あなたの子スレッドがいつ実行を終了したかを知る必要があります。 mythread.isAlive()を使用してスレッドがまだ生存しているかどうかを確認できますが、ループで実行することはできません.tkinterのメインループが実行されなくなり、インターフェイスが描画されるためです。私はこの問題に対処するためにat the answer hereを見ることを提案する。

関連する問題