Fork me on GitHub


Gdy nie chcesz niszczyć okna w PyGTK

nie zapomnij o return True.

Pisząc pewną aplikację (o której wkrótce) musiałem zaimplementować następującą funkcjonalność: przy próbie zamknięcia (kliknięcia w [X], Alt+F4, whateva’) okno ma się po prostu schować.
Niby proste, we wszystkich tutorialach i przykładach bindują gtk.main_quit() do sygnału „destroy” wysyłanego przez okno.

window.connect("destroy", lambda a: gtk.main_quit())

Lambda w tym przypadku zwraca funkcje przyjmującą jeden argument (nakładka na gtk.main_quit) ponieważ przy przechwyceniu sygnału destroy jako parametr przekazywany jest niszczony obiekt.

Przystosowując powyższą linijkę do naszych potrzeb nie powinno być problemu, obiekt gtk.Window powinien przestać być widoczny. Tak się właśnie stało, ale…

…po wywołaniu metody show okno było puste. Obiekt był przekazywany dalej, do niszczenia.

Rozwiązanie jest nadzwyczaj proste: http://www.pygtk.org/docs/pygtk/class-gtkwidget.html#signal-gtkwidget–delete-event
gtk.Window dziedziczy ten syngał pośrednio po gtk.Widget.

Wystarczy zbindować „delete_event” do odpowiedniej funkcji zwracającej True.

def hide(widget=None, event=None):
    global hidden 
    hidden = True
    return True 
 
window.connect("delete_event", hide)

Rada: Dokumentacja to druga rzecz po tutorialu jaką powinieneś sprawdzić. Ufaj jej, nie skacz po nagłówkach i czytaj dokładnie cały opis – w przeciwnym wypadku tylko zmarnujesz czas. Sprawdzaj dziedziczenie obiektów.


Opublikowany: 03 lip 2008
Tagi:
Kategorie: programowanie, Python |