PyGObject: Gtk.EventBox
EventBox
Un widget Gtk.EventBox è una sottoclasse di Gtk.Bin che possiede una propria Window.
Viene spesso utilizzato quando vogliamo catturare gli eventi per quei widget che non possiedono
una propria finestra, come ad esempio le Immagini.
Le properties principali sono:
Name | Type | Flags | Short Description |
---|---|---|---|
above-child | bool | r/w/en | Se la finestra della eventbox, si trova sopra la finestra del widget figlio, invece che sotto di essa |
visible-window | bool | r/w/en | Se la event box è visibile, anzichè invisibile ed usata solo per intercettare gli eventi |
Segnali
I segnali sono quelli ereditati da Gtk.Container, Gtk.Widget e GObject.Object.
Metodi
Oltre ai soliti getter e setter relativi alle properties dell’oggetto Gtk.EventBox,
i principali metodi sono:
new()
Crea un nuovo widget Gtk.EventBox.
>>> import gi ... gi.require_version('Gtk', '3.0') ... from gi.repository import Gtk ... >>> image = Gtk.Image.new_from_file("image.png") >>> eventbox = Gtk.EventBox.new() >>> eventbox.add(image)
get_above_child()
Ritorna True se la finestra della eventbox è sopra alla window del proprio child,
altrimenti ritorna False, se si trova sotto.
Vedere Gtk.EventBox.set_above_child() per i dettagli.
get_visible_window()
Ritorna True se la finestra della eventbox è visibile, altrimenti False
Vedere Gtk.EventBox.set_visible_window() per i dettagli.
set_above_child(above_child)
Setta se la finestra dell’event box debba essere posizionato sopra la finestra del suo widget
child, anzichè sotto. Se la finestra e sopra, tutti gli eventi dentro la event box andranno alla
eventbox. Se la finestra e sotto, gli eventi nella finestra del child, prima andranno al child
stesso, poi al suo genitore. Il default è tenere la finestra sotto alla finestra del child widget.
Parametri:
above_child: il boolean che a True pone la finestra dell’event box
sopra alla finestra del child widget;
set_visible_window(visible_window)
Setta se l’event box debba usare una finestra visibile o invisibile.
Il default è usare una finestra visibile.
In una finestra di event box invisibile, la window creata per l’event box è di tipo
Gdk.WindowWindowClass.INPUT_ONLY, che significa appunto che è invisibile e serve solo per
ricevere eventi. Una finestra di event box visibile, è di tipo Gdk.WindowWindowClass.INPUT_OUTPUT,
cioè che agisce da parent window per tutti i widgets contenuti nell’event box.
Per intercettare solo gli eventi, la finestra di event box dovrebbe essere invisibile.
Creare una finestra visibile, potrebbe generare anche degli artifacts visibili all’utente,
specialmente se l’utente sta usando un tema con gradienti o pixmaps.
La ragione di creare un event box non input-only è se vogliamo settare un background o disegnare
su di essa.
C’è un problema per gli event box invisibili che hanno la loro finestra sotto al child (vedere
Gtk.EventBox.set_above_child(). Dal momento che la finestra input-only non è una finestra
genitore di ogni finestra creata dai widgets discendenti dell’event box, gli eventi su queste
finestre non sono propagati dal windowing system, ma solo da GTK+.
In pratica se un evento non è nell’event mask della finestra discendente (vedere
Gtk.Widget.add_events()), non sarà ricevuta dall’event box.
Questo non succede per gli event box visibili, perchè in tal caso, la finestra della event box
è genitore delle finestre discendenti.
Parametri:
visible_window: il boolean che rende la finestra dell’event box
visibile;
Ecco un codice di esempio:
import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class GWindow(Gtk.Window): def __init__(self): super().__init__(title="EventBox example") self.set_default_size(250, 100) image = Gtk.Image.new_from_file("image.png") eventbox = Gtk.EventBox.new() eventbox.add(image) self.add(eventbox) eventbox.connect("button_press_event", self.on_click) def on_click(self, widget, param): print("INFO: clicked on %s" % widget.get_child().get_property("file")) if __name__ == "__main__": win = GWindow() win.connect("destroy", Gtk.main_quit) win.show_all() Gtk.main()
link di riferimento:
Commenti recenti