Label-Text (Tkinter) laesst sich nicht sofort setzen

Fragen zu Tkinter.
Antworten
madgonzales

Ein neues Problem hat mich ereilt: ein Label-Text (tkinter) soll gesetzt werden ("Reading dictionary-files.."). Dies passiert aber (anders als der print-Befehl, s. Code) erst nachdem die Datei eingelesen worden ist und nicht sofort.

Wer kann da weiterhelfen?

...
self.statusVar = StringVar()
self.statusLabel = Label(self.StatusFrame,textvariable=self.statusVar)
self.statusLabel.pack(side=TOP)
self.StatusFrame.pack(side=BOTTOM)
self.statusVar.set("Reading dictionary-files..") # dies passiert erst nach dem Datei-Einlesen (s.u.) !?
self.pack()

dicfile = "./dictionaries/eng_deu.dic"
print dicfile # dies passiert sofort

# Datei oeffnen und zeilenweise lesen
f = open(dicfile, "r")
line = f.readline()
while line <> "":
line = f.readline() # hej! wie kann ich in diesem forum text einruecken?

f.close()
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Stichwort self... du arbeitest also mit Klassen. Kann es sein, dass du eine Instanz der Klasse erst nach dem Dateieinlesen bildest? (mir fehlt da ein wenig Code um das zu beurteilen).

Einrücken kannst du hier mit den [code]...[/code] Tags.
madgonzales

Hab mein Programm mal verkuerzt, um dem Fehler beizukommen. Der folgende Code verhaelt sich so, dass erst die Datei geladen wird und dann das Fenster erscheint (mit statusLabel["text"] = "Done.").
Gewuenscht ist aber, dass das Fenster erscheint, der Label-Text "Reading dictionary-files.." erscheint, die Datei geladen wird und dann der Label-Text auf "Done." gesetzt wird.

Vielleicht weiss jemand, wie man's macht?

Code: Alles auswählen

from Tkinter import *
from tkFont import *

class MainWindow(Tkinter.Frame):
    def __init__(self):        
        Frame.__init__(self)
        StatusFrame = Frame()
        statusVar = StringVar()
        statusLabel = Label(StatusFrame,textvariable=statusVar)
        statusLabel.pack(side=TOP)
        StatusFrame.pack(side=BOTTOM)
        statusVar.set("Reading dictionary-files..") 
        self.pack()                                

        dicfile = "./dictionaries/unidad_0.dic"
        print dicfile # dies passiert sofort

        # Datei oeffnen und zeilenweise lesen
        f = open(dicfile, "r")
        line = f.readline()
        while line <> "":
           print line
           line = f.readline()
        f.close()       

        statusVar.set("Done.")
               
if (__name__ == "__main__"):
    # create the application
    App = MainWindow()
    App.mainloop()
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
madgonzales hat geschrieben:Vielleicht weiss jemand, wie man's macht?
Bevor die Datei nicht komplett eingelesen wurde, kommen GUI-Events gar nicht erst zum Zuge. Dafür ist deren Priorität zu niedrig. Mit update_idletasks() kannst Du aber erzwingen, dass erstmal die anstehenden Events abgearbeitet werden, bevor es weitergehen soll.

Code: Alles auswählen

...
self.pack()
self.update_idletasks()
...
hth
Jan
madgonzales

Danke, Voges!
Die Loesung kann so einfach sein, wenn man drauf kommt :P
Antworten