Frage Schließen Sie das gtk-Fenster programmatisch


Wenn Sie ein Unterfenster in GTK haben und es programmgesteuert schließen möchten (z. B. durch Drücken einer Speicherschaltfläche oder der Escape-Taste), gibt es eine bevorzugte Möglichkeit, das Fenster zu schließen?

Z.B.,

window.destroy()
# versus
window.emit('delete-event')

8
2018-05-15 00:07


Ursprung


Antworten:


Du solltest benutzen window.destroy() wenn man ein Fenster in PyGTK löscht (oder irgendeine Art von Widget). Wenn du anrufst window.destroy() Das Fenster wird a ausgeben delete-event Ereignis automatisch.

Wenn Sie ein Signal für ein Ereignis mit PyGTK ausgeben, müssen Sie außerdem fast immer ein Ereignisobjekt an die emit-Methode übergeben (siehe pyGObject-Dokumentation für die emit-Methode). Wenn ein Versuch unternommen wird, ein gtk.gdk.Event(gtk.EVENT_DELETE) auf die emit-Methode eines Objekts für a delete-event es wird nicht funktionieren. Z.B:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gtk
>>> w = gtk.Window()
>>> w.show()
>>> w.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE))
False

Vielleicht ist der beste Weg jedoch, einfach die del Anweisung, die automatisch das Fenster / Widget löscht und alle notwendigen Bereinigungen für Sie vornimmt. Dies ist mehr "pythonisch" als das Aufrufen von window.destroy (), was um einen Verweis auf ein zerstörtes Fenster herumgeht.


8
2018-05-15 00:39



Die Methode destroy funktioniert nicht wie erwartet, da die 'delete-event'-Callbacks für das zerstörte Fenster nicht aufgerufen werden. Ein Editor hat zum Beispiel keine Möglichkeit den Benutzer zu fragen, ob die Datei gespeichert werden soll .

[3|zap@zap|~]python
Python 2.7.3 (default, Jul 24 2012, 10:05:38) 
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gtk
>>> w = gtk.Window()
>>> w.show()
>>> def cb(w,e):
...   print "cb", w, e
...   return True
... 
>>> w.connect ('delete-event', cb)
>>> w.destroy()

Im obigen Beispiel ruft das Aufrufen von w.destroy () den Callback nicht auf, während das Klicken auf die Schaltfläche "close" es aufruft (und das Fenster wird nicht geschlossen, weil der Callback True zurückgegeben hat).

Daher müssen Sie sowohl das Signal ausgeben als auch das Widget zerstören, wenn die Signalbehandlungsroutinen False zurückgegeben haben, z.

if not w.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE)):
  w.destroy()

15
2017-10-24 23:17