Seite 1 von 1

Label-Text (Tkinter) laesst sich nicht sofort setzen

Verfasst: Freitag 15. August 2003, 00:03
von 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()

Verfasst: Freitag 15. August 2003, 09:51
von Milan
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.

Verfasst: Freitag 15. August 2003, 15:46
von 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()

Verfasst: Freitag 15. August 2003, 16:28
von Voges
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

Verfasst: Freitag 15. August 2003, 17:03
von madgonzales
Danke, Voges!
Die Loesung kann so einfach sein, wenn man drauf kommt :P