2017-05-18 19 views
0

バーが終了したら(3秒間)、プログレスバーウィンドウを表示しようとしていますが、ウィンドウは表示されませんすべてが完了するまで生成します。なぜ、最初にバーを生成するのではなく、ボタンが3秒間スリープするのですか?これをどのように機能させることができますか?このコードは、問題の理解を容易にするために、3つの別々の機能に分かれています。ありがとうございます。完了時にウィンドウを閉じるプログレスバー

from Tkinter import * 
from ttk import Progressbar 
from time import sleep 

def Generate_Invoice(toplevel): 
    Generating_Label=Label(toplevel, text="Please wait while we generate your invoice...") 
    progress = Progressbar(toplevel, maximum=100,mode='determinate') 
    Generating_Label.pack(side=TOP) 
    progress.pack(fill=X) 
    progress.start(10) 

def Timer(toplevel): 
    sleep(3) 
    toplevel.destroy() 

def Work(): 
    toplevel=Toplevel() 
    Generate_Invoice(toplevel) 
    Timer(toplevel) 


window=Tk() 
Generate=Button(window, text="Generate invoice",command=Work) 
Generate.pack() 
window.mainloop() 
+0

このコードは、ループ範囲の量のために(100)ウィンドウ 'を初期化する前に上であるために、それが待つだけ異なる同じことを行い["value"] == 100: toplevel.destroy() ' –

答えて

0

このような複雑なコードをオブジェクトにする方がよいでしょう。関数によって、論理的に分解するのが難しくなります。

import ttk 
from time import sleep 
import Tkinter as tk 


class App(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     self.button = ttk.Button(text="Generate Invoice", command=self.start) 
     self.button.pack() 
     self.labelText = tk.StringVar() 
     self.genLabel = ttk.Label(textvariable=self.labelText) 
     self.labelText.set(" ") 
     self.genLabel.pack() 
     self.progress = ttk.Progressbar(self, orient="horizontal",length=150, mode="determinate") 
     self.progress.pack() 
     self.pr = 0 
     self.prmax = 0 

    def increase(self): 
     self.pr += 5 
     self.progress["value"] = self.pr 
     if self.pr < self.prmax: 
      self.after(100, self.increase) 

    def start(self): 
     self.progress["value"] = self.pr 
     self.prmax = 100 
     self.progress["maximum"] = self.prmax 
     self.labelText.set("Generating Invoice") 
     self.increase() 

app = App() 
app.mainloop() 

これは私が今見つけることができない他の誰かのプログラムに基づいています:Pと私はあなたがそれをしたいと思いますどのように動作します。 StringVar()は、ラベルテキストの変更をカプセル化するために使用されます。 免責事項私は良いGUIプログラマーではないので、これは無駄に非効率的である可能性があります。 印刷量 進捗[「値」] =量 進捗場合:

+0

これは素晴らしいですが、OOPを使用するにはあまりにも複雑すぎます。私は新人になってそれを正しく行う方法を知っています。 –

+1

私はそれを発見しました.update()コマンドを使用すると、とにかく感謝:) –

関連する問題