2013-03-09 8 views
6

Nun weiß ich, dass Sie überprüfen können, ob ein Fenster existiert nach:Wie sehen Sie, ob ein Widget in Tkinter existiert?

x.winfo_exists() 

, die einen Boolean zurückgibt. Jetzt habe ich gesucht, konnte aber nicht genau finden, was ich brauche. Genauer gesagt muss ich die Existenz meines Knöpfe, Etiketten, Listenfelder, Schieber usw. 1

+1

Ihre Frage ist unklar. Sie sagen, Sie wissen, dass Sie 'winfo_exists' aufrufen können, um zu bestimmen, ob ein Widget existiert, aber Sie wissen nicht, wie Sie feststellen können, ob _ihre_ Widgets existieren? –

+0

NEIN, um zu sehen, ob ein Fenster existiert. Ich wusste nicht, dass es auch für Widgets funktioniert hat, bis ich diese Antwort bekam. Danke übrigens. – madprogramer

Antwort

15

winfo_exists kehrt zu überprüfen, wenn Sie das Widget zerstört haben, in welchem ​​Fall es 0 auf jedem Widget-Klasse Diese Methode gibt kann aufgerufen werden, , nicht nur die Tk Root oder Toplevels. Alternativ können Sie auch alle Kinder eines Widgets mit winfo_children erhalten:

>>> import Tkinter as tk 
>>> root = tk.Tk() 
>>> label = tk.Label(root, text="Hello, world") 
>>> label.winfo_exists() 
1 
>>> root.winfo_children() 
[<Tkinter.Label instance at 0x0000000002ADC1C8>] 
>>> label.destroy() 
>>> label.winfo_exists() 
0 
>>> root.winfo_children() 
[] 
+0

Falls Sie das Frame-Objekt nicht zu "root" zurückgeliefert haben (oder direkt von ihm nicht erstellt wurden), können Sie 'label.destroy()' nicht ausführen, aber Sie können immer noch nach 'root 'suchen und iterieren. winfo_children() 'liste. Zum Beispiel 'root.winfo_children() [0] .destroy()' oder 'root.winfo_children() [1] .destroy()', falls Sie oben ein Menü haben. Wie auch immer, es ist einfacher, Griffe für jeden verwendeten Rahmen zu erstellen, und fügt jede Taste/jedes Etikett/etc in einen Hauptrahmen ein. – erm3nda

1

Sie können auch die Art drucken d.h .. type (Label). Dies kann hilfreich sein, um nicht nur Existenz zu liefern, sondern auch zu finden, ob irgendetwas "NoneType" ohne Fehler auftaucht. Der type() sagt Ihnen, ob Sie eine Instanz oder einen anderen Typ haben, der wertvolle Anhaltspunkte dafür liefern kann, wie nahe das Programm läuft oder Elemente an das zurückgibt, von dem Sie denken, dass Sie es fragen! Die Objekte object.winfo_exists() und object.winfo_children sind spezifisch und erhalten einen Fehler, wenn das Objekt nicht vom Typ 'instance' ist.

+0

[Wie schreibe ich eine gute Antwort] (http://stackoverflow.com/help/how-to-answer) – Manish