2016-08-20 6 views
0

Nachdem es mir gelungen ist, einen Fortschrittsbalken in der Konsole zu erstellen, dachte ich über das Upgrade des Programms auf GUI nach.Etwas schief gelaufen, während ich meine Fortschrittsbalken in der GUI gemacht habe

Dies ist mein Code:

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() 

Wenn ich das Programm starten, es tut nichts; kein Fehler, kein Fenster geht hoch.

Ich begann, es zu debuggen und versuchte, das Problem zu verstehen. Wenn ich den gesamten Code unter der __init__ Funktion lösche, würde das Fenster aufgehen. Dafür denke ich, vielleicht ist die while Schleife das Problem hier.

Kann mir jemand sagen, was das Problem in diesem Programm ist?

+1

nicht die Funktion Sie _call_, dass Sie versuchen, zu einem Event-Handler für christssake zu verbinden. Vielleicht werden die Leute dieses Konzept in tausend Jahren endlich verstehen ... 'command = self.startprogress()' -> 'command = self.startprogress'. –

+0

Habe es getan. Das Fenster kam auf, aber wenn ich Start drücke, friert das ganze Programm ein –

+0

Ihre 'startprogress'-Funktion stellt eine Billion' self.updateprogress' mit 'root.after (100, self.updateprogress)' vor 'self.value' bereit immer inkrementiert. Befreien Sie sich von der Schleife und tun Sie einfach 'root.after (100, self.updateprogress)' am Ende von 'updateprogress'. –

Antwort

2

Blick auf diesen Code:

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

Dies ist eine Endlosschleife. Ich hoffe, ich muss nicht erklären warum.

Was Sie wollten wahrscheinlich tun, ist dies:

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

genau was ich getan habe. Danke –

+0

Nicht nur ist es eine Endlosschleife, es ist eine Endlosschleife, die Endlosschleifen erstellt. –

+0

'command = self.startprogress()' als Teil des ursprünglichen Problems könnte auch erklärt werden. –

Verwandte Themen