mainloop beenden

Fragen zu Tkinter.
Antworten
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

huhu!

Ich erstelle mit Tkinter ein Fenster, in dem verschiedene Objekte enthalten sind.
Am Ende des Porgramms steht

Code: Alles auswählen

canvas.mainloop()
.

Ich möchte nun, dass nach Ausführen des Programms das Fenster nach 10 Sekunden verschwindet und das ganze Programm endet.
Das

Code: Alles auswählen

time.sleep(10)
canvas.destroy()
funktioniert nicht.

Wie kann ich das Fenster schließen?


Gruß
Paul
BlackJack

@Peak_me: Vor dem starten der `mainloop()` müsstest Du mit der `after()`-Methode eine Funktion zum beenden mit einer entsprechenden Verzögerung angeben. Die Methode gibt es auf jedem Tkinter-Widget.
problembär

Was ist denn Dein "canvas" für ein Widget?
Normalerweise wendet man ".mainloop()" bei Tkinter.Tk an, weniger bei Tkinter.Canvas (auch wenn das auch möglich ist).
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

@BlackJack:

Code: Alles auswählen

canvas.after(10*1000, canvas.quit)
funktioniert perfekt.
danke!

@problembär
Ich verwende Tkinter.Tk.
problembär

.quit() ist viel zu hart, und wahrscheinlich nicht das, was Du willst.
Du willst "mainwindow.destroy()", wobei mainwindow das Tkinter.Tk-widget ist, wenn Du denn eines benutzt. Guckstu:

Code: Alles auswählen

#!/usr/bin/env python

import Tkinter

class myWindow:

    def __init__(self):

        self.mw = Tkinter.Tk()
        self.cv = Tkinter.Canvas(self.mw, bg = 'white')
        self.cv.pack()
        self.mw.after(10000, self.mw.destroy)
        self.mw.mainloop()

if __name__ == "__main__":
   app = myWindow()
Gruß
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi Paul!
Peak_me hat geschrieben:

Code: Alles auswählen

time.sleep(10)
canvas.destroy()
funktioniert nicht.
Damit entfernst Du auch nur das canvas-Objekt von seinem Elternwidget. Um das Programm zu beenden, muss, wie weiter oben erwähnt, das Wurzelobjekt zerstört werden. Damit wird automatisch auch die Eventverarbeitung (mainloop) deaktiviert. Das machst Du am besten mit

Code: Alles auswählen

canvas.after(10000, canvas._root().destroy)
Das Tk-Hauptfenster wird automatisch erzeugt, wenn Du einen Tkinter.Canvas ohne Angabe eines Elternknotens instanzierst - sofern es nicht schon existierte. An das direkte Elternwidget kommst Du über canvas.master, aber wenn canvas ein verschachteltes Widget ist, findest Du die Wurzel direkt mit canvas._root(). Die Variante mit time.sleep(10) funktioniert auch, das Fenster reagiert dann aber nicht auf Events. Wenn das erwünscht ist, kannst Du auch Deine Variante in Kombination mit canvas._root verwenden.

Das canvas.quit() ist eigentlich schwächer, da es 'nur' die event-Schleife beendet. In Deinem Fall verhindert aber nur die Tkinter-mainloop das Beenden des Programms. Wenn Du sie unterbrichst, endet das Programm und allein das Aufräumen entsorgt dann das Tk-Wurzelobjekt inklusive aller Kinder.

Also alles ganz logisch. :)

VG,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten