Seite 1 von 1
mainloop beenden
Verfasst: Mittwoch 23. Juni 2010, 17:03
von Peak_me
huhu!
Ich erstelle mit Tkinter ein Fenster, in dem verschiedene Objekte enthalten sind.
Am Ende des Porgramms steht
.
Ich möchte nun, dass nach Ausführen des Programms das Fenster nach 10 Sekunden verschwindet und das ganze Programm endet.
Das
funktioniert nicht.
Wie kann ich das Fenster schließen?
Gruß
Paul
Re: mainloop beenden
Verfasst: Mittwoch 23. Juni 2010, 17:58
von 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.
Re: mainloop beenden
Verfasst: Mittwoch 23. Juni 2010, 19:25
von 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).
Re: mainloop beenden
Verfasst: Donnerstag 24. Juni 2010, 12:20
von Peak_me
@BlackJack:
funktioniert perfekt.
danke!
@problembär
Ich verwende Tkinter.Tk.
Re: mainloop beenden
Verfasst: Donnerstag 24. Juni 2010, 19:21
von 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ß
Re: mainloop beenden
Verfasst: Dienstag 20. Juli 2010, 11:18
von Michael Schneider
Hi Paul!
Peak_me hat geschrieben:
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
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