Seite 1 von 1

Problem mit root.mainloop()

Verfasst: Montag 30. Januar 2006, 10:42
von snakeseven
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

Verfasst: Montag 30. Januar 2006, 13:26
von modelnine
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.

Verfasst: Montag 30. Januar 2006, 22:57
von snakeseven
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