2016-08-10 15 views
0

私があなたを助けてくれるのだろうかと思います。私はプログレスバーのGUIを作成するためのコードを見て、私はそれが欲しい値をプログレスバーを送ることができるように少しそれを変更しようとしています。予想通り1 GUIの作成中のプログラムが終了した、必要に応じてそれが閉じるまで、しかし、それは空のまま - 以下は、私のコードは、私が印刷メッセージがprogresively 0から増加のコードを実行するとPythonプログレスバーGUI

import tkinter as tk 
from tkinter import ttk 
import time 

class progress_bar(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     self.progress = ttk.Progressbar(self, orient="horizontal", length=200, mode="determinate") 
     self.progress.pack() 
     self.val = 0 
     self.maxval = 1 
     self.progress["maximum"] = 1 

    def updating(self, val): 
     self.val = val 
     self.progress["value"] = self.val 
     print(self.val) 

     if self.val == self.maxval: 
      self.destroy() 

def test(): 
    for i in range(0, 101): 
     time.sleep(0.1) 
     app.updating(i/100) 

app = progress_bar() 
app.after(1, test) 
app.mainloop() 

です。 GUIが更新されるように修正する必要があることを教えてください。提供されたヘルプについて事前に感謝します。

答えて

2

あなたが抱えている問題は、あなたのtestファンクションブロックというtkinterイベントループです。つまり、プログレスバーのvalueが更新されても、進捗状況は画面に表示されません(testが終了するまで何も表示されないため)。

これを修正するには、ループを取り除いてtestにして、代わりにtkinterコードを使用して繰り返し更新を行う必要があります。

はここで動作するはずtestの修正版です:

def test(i=0): 
    app.updating(i/100) 
    if i < 100: 
     app.after(100, test, i+1) 

のではなく、明示的にループし、それ自体は100ミリ秒ごとに再スケジュールします。ループ変数であるiではなく、それは今や引数であり、スケジュールされた各呼び出しは、それ以前のものよりも大きい値iを取得します。

+0

ありがとうございます。完璧に動作します。とても有難い –