Home > Gtk3, PyGObject, python > PyGObject: Gtk.EventBox

PyGObject: Gtk.EventBox

13 Aprile 2020

torna all’indice appunti

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:

torna all’indice degli appunti
Gtk3 EventBox

Categorie:Gtk3, PyGObject, python Tag: , ,
I commenti sono chiusi.