2009-03-30 7 views
2

Ich benutze tkinter mit Python, um eine Benutzeroberfläche für ein Programm zu erstellen, das Excel-Dateien in CSV konvertiert.Python tkinter Etikett ändert sich nicht am Anfang der Funktion

Ich habe ein Label erstellt, das als Statusleiste dient, und statusBarText als StringVar() als textvariable festlegen. inputFileEntry und outputFileEntry sind Textvariablen, die die Eingabe- und Ausgabedateipfade enthalten.

def convertButtonClick(): 
    statusBarText.set('Converting...') 

    if inputFileEntry.get() == '' or outputFileEntry.get() == '': 
     statusBarText.set('Invalid Parameters.') 
     return 

    retcode = subprocess.('Program.exe' ,shell=true) 

    if retcode == 0: 
     statusBarText.set('Conversion Successful!') 
    else: 
     statusBarText.set('Conversion Failed!') 

Diese Funktion aufgerufen wird, wenn Sie auf die Schaltfläche Konvertieren klicken, und alles funktioniert AUSSER fein, dass die Statusleiste ändert sich nie zu sagen: ‚Konvertieren ...‘.

Der Text der Statusleiste wird in ungültige Parameter geändert, wenn entweder die Eingabe oder die Ausgabe leer sind und je nach Rückkehrcode zu Erfolg oder Fehlschlag wechseln. Das Problem ist, es ändert sich nie zu "Converting ..."

Ich habe diese genaue Zeile in die if-Anweisungen kopiert und eingefügt, und es funktioniert gut, aber aus irgendeinem Grund ändert es sich nie, bevor der Subprozess ausgeführt wird, wenn es an ist der Anfang der Funktion. Jede Hilfe würde sehr geschätzt werden.

+0

Verwenden Sie nicht shell = True für Subprozess. – nosklo

Antwort

10

Da Sie dies alles in einem einzigen Methodenaufruf tun, wird die GUI nie eine Möglichkeit zum Aktualisieren erhalten, bevor Sie Ihren Subprozess starten. Check out update_idletasks() aufrufen ...

von http://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html

w.update_idletasks() einige Aufgaben in die Anzeige aktualisiert, wie Ändern der Größe und Nachziehen Widgets, werden im Leerlauf Aufgaben genannt, weil sie in der Regel zurückgestellt werden, bis die Anwendung hat beendete die Behandlung von Ereignissen und ist zurück in die Hauptschleife gegangen, um auf neue Ereignisse zu warten.
Wenn Sie die Aktualisierung der Anzeige erzwingen möchten, bevor die Anwendung als nächstes inaktiviert wird, rufen Sie die Methode w.update_idletasks() für ein beliebiges Widget auf.

+0

Froh, es hat funktioniert :) –

+0

Hallo, aus irgendeinem Grund scheint dies einmal zu funktionieren, aber auf den nächsten 'Updates' scheint w.update_ideltasks() nicht zu funktionieren. Wo genau soll ich diesen Code einfügen? Vielen Dank – Jona

3

Wie erstellen Sie Ihr Label? Ich habe diese kleine Testaufbau:

from Tkinter import * 
class LabelTest: 

    def __init__(self, master): 
     self.test = StringVar() 

     self.button = Button(master, text="Change Label", command=self.change) 
     self.button.grid(row=0, column=0, sticky=W) 

     self.test.set("spam") 
     self.testlabel = Label(master, textvariable = self.test).grid(row = 0,column = 1) 
    def change(self): 

     self.test.set("eggs") 



root = Tk() 
root.title("Label tester") 
calc = LabelTest(root) 

root.mainloop() 

Und es funktioniert. Haben Sie sichergestellt, dass "textvariable = StatusBarText" statt "text = StatusBarText.get()" verwendet?