Problem mit root.mainloop()

Fragen zu Tkinter.
Antworten
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hallo,
ich habe ein Problem mit mainloop() von Tk(). Folgendes Script demonstriert, daß sich das Tkinter-Fenster erst aufbaut, wenn die while-Schleife in testloop() terminiert. Rufe ich mainloop() an Position 1 auf, wird zwar das Fenster wie gewünscht zuerst aufgebaut, aber die Funktion testloop() nicht betreten. Was ich will, ist den Aufbau der grafischen Umgebung und anschließendes Ausführen von testloop(). Geht das mit Tkinter überhaupt ?

Gruss, Seven

Code: Alles auswählen

from Tkinter import Tk
import time

root =  Tk()
#root.mainloop()                      #Position 1

def testloop():
    i=1
    while i <=5:
        print i
        i += 1
        time.sleep(1)

testloop()
root.mainloop()                        #Position 2
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Also, prinzipiell verstehst Du erst einmal etwas hier nicht. Alle GUI-Frameworks sind sogenannte Event-Frameworks, weil sie einen eigenen Main-Loop haben. Dieser Main-Loop ist im Endeffekt eine while-Schleife die regelmäßig auf Fensternachrichten pollt, und dann entsprechende Schritte mittels Callbacks einleitet. Das ist bei wxPython, PyQt, Tkinter, pygtk, etc. auch so.

Du hast nun eine eigene Schleife; diese verbraucht Zeit, die natürlich nicht für den Event-Loop des Frameworks zur Verfügung steht, deswegen können Fenster-Befehle auch in dieser Zeit nicht ausgeführt werden.

Du hast jetzt zwei Möglichkeiten:

1. den Code der parallel ausgeführt werden soll in einen Thread auslagern,
2. den Code in sehr kleine und kurze Stückchen aufteilen und diese nacheinander mittels eines Alarm Callbacks (siehe http://www.pythonware.com/library/tkint ... -other.htm ausführen).

Gerade wenn Du noch nie mit Event-Frameworks gearbeitet hast kann ich Dir nur empfehlen das Tutorial zu Tkinter mal ein bisschen genauer zu begucken.

--- Heiko.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Danke, klappt super mit "root.after(500,callback)". Gefällt mir besser als die Threadlösung, zumindest wenns auf die Millisekunde nicht ankommt.
Gruss, Seven
Antworten