2016-08-20 6 views
0

コンソールでプログレスバーを作成した後、プログラムをGUIにアップグレードすることを考えました。GUIでプログレスバーを作成中に何か問題が発生しました

これは私のコードです:私はプログラムを起動すると

from tkinter import * 
class Progress(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.grid() 
     self.value = 1 
     self.endvalue = 100 
     self.bar_length = 20 

     self.label1 = Label(self) 
     self.label1.grid() 

     self.button1 = Button(self, text = "Start", command = self.startprogress()) 
     self.button.grid() 
    def startprogress(self): 
     while self.value <= self.endvalue: 
      root.after(100, self.updateprogress) 
    def updateprogress(self): 
     percent = float(self.value)/self.endvalue 
     arrow = '|' * int(round(percent * self.bar_length)-1) + '|' 
     spaces = ' ' * (self.bar_length - len(arrow)) 
     self.label1.configure(text = "Percent: [{0}] {1}%".format(arrow + spaces, int(round(percent * 100)))) 
     self.value+=1 

root = Tk() 
root.title("Progress") 
app = Progress(root) 
root.mainloop() 

、それは何もしません。エラーも窓も上がらない。

私は、問題を理解しようとすると、デバッグを開始しました。 __init__の機能の下にあるすべてのコードを消去すると、ウィンドウが表示されます。そのためにはおそらくwhileループが問題になると思います。

誰かが私にこのプログラムの問題点を教えてもらえますか?このコードでは

+1

あなたはchristssakeのイベントハンドラに接続しようとしている機能を_call_ないでください:あなたはおそらくやりたいこと

はこれです。たぶん、1000年後に人々はついにこのコンセプトを理解するでしょう... 'command = self.startprogress()' - > 'command = self.startprogress'。 –

+0

それをしました。ウィンドウが表示されたが、Startを押すとプログラム全体がフリーズする –

+0

'startprogress'関数は' self.updateprogress'を 'root.after(100、self.updateprogress)'の前に 'self.value'の前にキューイングしますこれまでに増分された。ループを取り除き、 'updateprogress'の最後に' root.after(100、self.updateprogress) 'を実行してください。 –

答えて

2

ルック:

def startprogress(self): 
    while self.value <= self.endvalue: 
     root.after(100, self.updateprogress) 

これは無限ループです。私は理由を説明する必要はないと思う。

def startprogress(self): 
    # queue ONE call to self.updateprogress 
    root.after(100, self.updateprogress) 

def updateprogress(self): 
    percent = float(self.value)/self.endvalue 
    arrow = '|' * int(round(percent * self.bar_length)-1) + '|' 
    spaces = ' ' * (self.bar_length - len(arrow)) 
    self.label1.configure(text = "Percent: [{0}] {1}%".format(arrow + spaces, int(round(percent * 100)))) 
    self.value+=1 

    # now that self.value has been incremented, queue ANOTHER call 
    if self.value <= self.endvalue: 
     root.after(100, self.updateprogress) 
+0

まさに私がやったこと。ありがとうございます –

+0

無限ループだけでなく、無限ループを作成する無限ループです。 –

+0

元の問題の一部である 'command = self.startprogress()'も説明できます。 –

関連する問題