2016-08-02 6 views
0

Ich habe eine Schaltfläche, die ich drücken möchte, um einige Excel-Daten zu verarbeiten. Dies dauert oft einen Moment oder zwei, besonders wenn der Benutzer eine Anzahl großer Dateien hochlädt. Während die Dateien verarbeitet werden, möchte ich dem Benutzer eine Notiz anzeigen, dass die Dateien verarbeitet werden und das Programm nicht eingefroren wurde. Sobald die Dateien fertig sind, möchte ich dies ebenfalls angeben.Tkinter, warum überspringt mein Code das erste Label-Update?

Dies ist der entsprechende Code habe ich bisher:

self.l2 = Label(self, text = " ", width = 20) 
    self.l2.grid(row = 3, column = 2, sticky = W) 

    # Calculate button 
    self.b2 = Button(self, text = "Calculate", command = self.calculate, width = 20) 
    self.b2.grid(row = 3, column = 3, sticky = W) 


def calculate(self): 
    self.l2.config(text="Processing...") 
    get_data(filelist, self.v.get()) 
    self.l2.config(text="Files Ready!") 

Das Label ist zunächst leer, wie ich will, und sobald die Dateien bereit sind, es zeigt „Dateien bereit“, aber es scheint nie die „Verarbeitung zu treffen "Etikett, selbst wenn ich genug Dateien für den Befehl get_data hochlade, um fast eine Minute zu dauern.

Warum genau würde es nicht angezeigt werden? Es scheint, als ob die Befehle sequentiell ausgeführt werden sollten, das Label sollte aktualisiert werden, get_data sollte aufgerufen werden, und sobald get _data zurückgegeben wurde, sollte das nächste Label-Update passieren. Ist diese Logik falsch?

Antwort

1

Damit der Bildschirm aktualisiert werden kann, muss die Ereignisschleife ein Aktualisierungsereignis verarbeiten können. Da der Code ausgeführt wird, ist die Ereignisschleife eingefroren.

A quick and dirty Lösung ist self.update_idletasks() zu nennen, die tkinter sagt all „idle“ Ereignisse zu behandeln, die Ereignisse im Zusammenhang mit der Aktualisierung des Bildschirm enthält.

self.l2.config(text="Processing...") 
self.update_idletasks() 
get_data(filelist, self.v.get()) 
self.l2.config(text="Files Ready!")