PyGObject: Gtk.SpinButton

13 Aprile 2020 Commenti chiusi

torna all’indice degli appunti

SpinButton

Il widget Gtk.SpinButton è un widget che consente all’utente di “aggiustare” un valore cliccando
sulle frecce laterali.
Oltre che essere incrementato e ridotto, il valore può essere inserito direttamente nella entry
del widget, con la comodità di essere validato, nello stesso momento dell’inserimento.

Per creare un SpinButton si utilizza il costruttore Gtk.SpinButton(**kwargs).

Le properties principali dell’oggetto spinbutton sono:

Name Type Flags Short Description
adjustment Gtk.Adjustment r/w l’oggetto Gtk.Adjustment
che gestisce il valore dello spinbutton
climb-rate float r/w/en il rapporto di accelerazione che abbiamo quando teniamo premuto un bottone o un tasto
digits int r/w/en il numero di decimali da visualizzare nello spinbutton
numeric bool r/w/en è un bool per visualizzare o meno i caratteri non numerici (True)
snap-to-ticks bool r/w/en è un bool che se a True, trasforma automaticamente i valori errati, nei valori dello step più vicino
update-policy Gtk.SpinButtonUpdatePolicy r/w/en è un oggetto Gtk.SpinButtonUpdatePolicy che regola l’aggiornamento dello spinbox.
True si aggiorna anche in caso di valore errato
value float r/w/en è un float legge il valore corrente, o ne setta uno nuovo
wrap bool r/w/en è un bool per avere il wrap, una volta raggiunto i suoi limiti
 
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk
>>> adjustment = Gtk.Adjustment(value=0, lower=0, upper=100, step_increment=2)
>>> spinbutton = Gtk.SpinButton(adjustment=adjustment, digits=1, value=20)

E’ possibile passare i parametri del widget in fase di costruzione, ma è possibile accedervi e
modificarli anche in seguito, utilizzando i metodi getter e setter get_property(property_name)
e set_property(property_name, property_value):

 
>>> spinbutton.get_property("value")
20.0
>>> spinbutton.set_property("digits", 2)

oppure con i metodi getter e setter specifici get_() e
set_(value):

 
>>> spinbutton.set_value(50)
>>> spinbutton.get_value()
50.0

Segnali

Per connettere un widget ad una callback, in modo che, quando viene emesso un segnale specifico,
quest’ultima venga invocata, si utilizza il metodo connect(signal, callback).
I segnali relativi allo spinbutton sono:

Name Short Description
change-value il segnale “change-value” viene emesso quando il valore dello spinbutton inizia a cambiare
input il segnale “input” può essere usato per influenzare la conversione dell’input in un valore
output il segnale “output” può essere usato per cambiare la formattazione del valore che viene visualizzato nella entry dello spinbutton
value-changed il segnale “value-changed” viene emesso quando il valore rappresentato dallo spin button, cambia
wrapped il segnale “wrapped” viene emesso subito dopo che lo spin button wrappa dal suo valore massimo, al suo minimo e vice-versa
 
>>> def on_change_value(button):
...     print("INFO: changing value to %s" % button.get_value())
...     
>>> spinbutton.connect("value_changed", on_change_value)
61
>>> spinbutton.set_value(20)
INFO: changing value to 20.0

Metodi

Di seguito i metodi utilizzabili con il widget Gtk.SpinButton:

new(adjustment, climb_rate, digits)

Il metodo costruttore che crea un nuovo oggetto Gtk.SpinButton.
Parametri:
adjustment: l’oggetto Gtk.Adjustment che lo spinbutton deve usare,
o None;
climb_rate: è un float che indica di quanto
accelererà il rapporto di cambiamento, quando teniamo premuti il bottone o il tasto di modifica;
digits: il numero di decimali da visualizzare;

new_with_range(min, max, step)

E’ un costruttore “scorciatoia” che costruisce un Gtk.SpinButton numerico senza dover prima creare
un oggetto Adjustment.
La property “value” viene inizialmente settata al valore minimo, il page-increment viene settato
a 10*step ed la precisione dello spinbutton viene settata a “step”.
Parametri:
min: il minimo valore (float) disponibile nello spinbutton;
max: il massimo valore (float) disponibile nello spinbutton;
step: il valore (float) che aggiungiamo e sottraiamo quando
regoliamo lo spinbutton;

configure(adjustment, climb_rate, digits)

Modifica le properties dello spinbutton.
Parametri:
adjustment: l’oggetto Gtk.Adjustment che aggiornerà l’adjustment
esistente, o None per lasciarlo invariato;
climb_rate: il nuovo float che aggiorna il climb rate esistente
digits: il numero di decimali da visualizzare nello spinbutton;

get_adjustment()

Ritorna l’oggetto Gtk.Adjustment associato allo spinbutton.

get_digits()

Ritorna la “precisione” dello spinbutton, ovvero i decimali visualizzati dallo stesso.

get_increments()

Ritorna una namedtuple con lo “step” ed il “page-increment” correnti.

>>> spinbutton.get_increments()
(step=2.0, page=0.0)
>>> spinbutton.get_increments().step
2.0

get_numeric()

Ritorna True se solo i numeri possono essere digitati nello spinbutton.

get_range()

Ritorna una namedtuple con il range impostato sullo spinbutton:

>>> spinbutton.get_range()
(min=0.0, max=100.0)
>>> spinbutton.get_range().max
100.0

get_snap_to_ticks()

Ritorna True se i valori vengono “corretti” sullo step più vicino.

get_update_policy()

Ritorna l’oggetto Gtk.SpinButtonUpdatePolicy(value), ovvero la
policy update corrente, che definisce il comportamento dello spinbutton.
Questo Enum definisce se lo spinbutton debba visualizzare i valori anche se questi sono fuori dal
range consentito:
ALWAYS (0): al refresh dello spinbutton, il valore extra-range è ancora
visualizzato;
IF_VALID (1): al refresh dello spinbutton, il valore viene visualizzato solo se
interno al range impostato;

>>> spinbutton.get_update_policy()
<enum GTK_UPDATE_ALWAYS of type Gtk.SpinButtonUpdatePolicy>

get_value()

Ritorna il valore corrente dello spinbutton.

get_value_as_int()

Ritorna il valore corrente dello spinbutton come intero (int).

get_wrap()

Ritorna True se il wrap è attivo sullo spinbutton, ovvero il valore dello
spinbutton, quando si raggiunge uno dei due limiti, ricomincia da quello opposto (se eccede dal
massimo, ricomincia dal minimo e se scende sotto il minimo, ricomincia dal massimo).

set_adjustment(adjustment)

Setta l’oggetto Gtk.Adjustment sullo spin button, rimpiazzando quello esistente.
Parametri:
adjustment: il Gtk.Adjustment che rimpiazzerà quello corrente;

set_digits(digits)

Setta la precisione dello spinbutton
Parametri:
digits: un intero che indica quanti decimali utilizzare e
visualizzare nello spinbutton;

set_increments(step, page)

Setta lo step ed il page-increment dello spinbutton.
Parametri:
step: il float che indica di quanto incrementa/decrementa il valore
ad ogni click sulla freccia su/giù dello spinbutton
page: il float che indica il page-increment ad ogni pressione di
PagUp/PageDown;

set_numeric(numeric)

Setta il flag numeric che indica se è possibile digitare caratteri non numerici nella entry dello
spinbutton.
Parametri:
numeric: il flag che attiva (True) la digitazione di caratteri
non numerici nello spinbutton;

set_range(min, max)

Setta i valori minimo e massimo nello spinbutton.
Parametri:
min: il float che fissa il limite minimo;
max: il float che fissa il limite massimo;

set_snap_to_ticks(snap_to_ticks)

Setta la policy da usare quando un valore non è corretto.
Parametri:
snap_to_ticks: il flag che indica se correggere un valore non
valido (True);

set_update_policy(policy)

Setta la update policy dello spinbutton
Parametri:
policy: l’oggetto Gtk.SpinButtonUpdatePolicy che può assumere i
due valori ALWAYS e IF_VALID, ovvero visualizzare o meno un valore che eccede dai limiti impostati
per lo spinbutton;

set_value(value)

Setta il valore dello spinbutton
Parametri:
value: il nuovo valore (float) da settare e visualizzare nello
spinbutton;

set_wrap(wrap)

Setta il flag wrap per lo spin button, ovvero se il valore deve ricominciare dal limite opposto,
quando si eccede da uno dei due impostati.
Parametri:
wrap: il flag che setta il wrap per lo spinbutton (True);

spin(direction, increment)

Incrementa o decrementa lo spinbutton di una certa quantità, in una certa direzione.
Parametri:
direction: l’oggetto Gtk.SpinType
che indica in che direzione muovere il valore. L’enum spintype può assumere i seguenti valori:
STEP_FORWARD (0): incrementa dello step corrente;
STEP_BACKWARD (1): decrementa dello step corrente;
PAGE_FORWARD (2): incrementa di un page-increment corrente;
PAGE_BACKWARD (3): decrementa di un page-increment corrente;
HOME (4): va al valore minimo;
END (5): va al valore massimo;
USER_DEFINED (6): cambia di un valore specificato dall’utente;
increment: il float che indica lo step incrementale da applicare
nella direzione “direction”;

>>> spinbutton.get_value()
0.0
>>> spinbutton.spin(direction=Gtk.SpinType.STEP_FORWARD, increment=0.0)
>>> spinbutton.get_value()
2.0
>>> spinbutton.spin(direction=Gtk.SpinType.END, increment=0.0)
>>> spinbutton.get_value()
100.0
>>> spinbutton.spin(direction=Gtk.SpinType.STEP_BACKWARD, increment=0.0)
>>> spinbutton.get_value()
98.0
>>> spinbutton.spin(direction=Gtk.SpinType.HOME, increment=0.0)
>>> spinbutton.get_value()
0.0
>>> spinbutton.spin(direction=Gtk.SpinType.USER_DEFINED, increment=7.0)
>>> spinbutton.get_value()
7.0

update()

Forza manualmente l’aggiornamento dello spinbutton.
Di seguito un codice d’esempio:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk


class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="SpinButton example")
        self.set_border_width(10)

        adjustment = Gtk.Adjustment(value=0, lower=0, upper=100,
                                    step_increment=2, page_increment=10,
                                    page_size=0)
        self.spinbutton = Gtk.SpinButton()
        self.spinbutton.set_adjustment(adjustment)
        self.spinbutton.set_wrap(True)
        check_numeric = Gtk.CheckButton(label="Numeric")
        check_ifvalid = Gtk.CheckButton(label="If Valid")
        # layout
        hbox = Gtk.Box(spacing=6)
        hbox.pack_start(self.spinbutton, False, False, 0)
        hbox.pack_start(check_ifvalid, False, False, 0)
        hbox.pack_start(check_numeric, False, False, 0)
        self.add(hbox)
        # bindings
        check_numeric.connect("toggled", self.on_numeric_toggled)
        check_ifvalid.connect("toggled", self.on_ifvalid_toggled)

    def on_numeric_toggled(self, button):
        self.spinbutton.set_numeric(button.get_active())

    def on_ifvalid_toggled(self, button):
        if button.get_active():
            policy = Gtk.SpinButtonUpdatePolicy.IF_VALID
        else:
            policy = Gtk.SpinButtonUpdatePolicy.ALWAYS
        self.spinbutton.set_update_policy(policy)


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 SpinButton

Categorie:Gtk3, PyGObject, python Tag: , ,

PyGObject: Gtk.ScrolledWindow

13 Aprile 2020 Commenti chiusi

torna all’indice appunti

ScrolledWindow

Il Gtk.ScrolledWindow è un contenitore che accetta un singolo child widget, lo rende “scrollable”
(scorrevole) usando, sia le scrollbars interne, sia con adjustments
associati dall’esterno e, opzionalmente, disegnando un frame attorno al child.
I Widgets con supporto nativo allo scrolling, cioè quelle classi che implementano l’interfaccia
Gtk.Scrollable, vengono aggiunti direttamente. Invece, per quei tipi di widgets
che non implementano tale interfaccia, si utilizza la classe Gtk.Viewport,
che funge da adattatore, fornendo la scrollabilità mancante.
Derivando Gtk.ScrolledWindow da Gtk.Container permette l’utilizzo del metodo
add() che intelligentemente tiene conto che un widget sia un oggetto
Gtk.Scrollable o meno. In caso negativo, Gtk.ScrolledWindow lascia gestire il
child alla classe Gtk.Viewport, che fornisce il child dell’interfaccia mancante.

Se non si specifica esplicitamente che la policy della Gtk.ScrolledWindow sia di tipo
Gtk.PolicyType.NEVER, o Gtk.PolicyType.EXTERNAL, allora la
Gtk.ScrolledWindow, aggiungerà i widget Gtk.Scrollbar attorno al child automaticamente.
La posizione di scroll del child, e se siano applicabili le scrollbars, viene deciso attraverso le
properties “:hadjustment” e “:vadjustment”.
Qualora il comportamento della Gtk.ScrolledWindow non fosse quello desiderato, è sempre possibile
settare il proprio scrolling ricorrendo ai widget Gtk.Scrollbar.

Le properties principali sono:

Name Type Flags Short Description
hadjustment Gtk.Adjustment r/w/c Il Gtk.Adjustment relativo alla posizione orizzontale
hscrollbar-policy Gtk.PolicyType r/w/en la policy che regola quando visualizzare la scrollbar orizzontale
kinetic-scrolling bool r/w/en la modalità di Kinetic scrolling
max-content-height int r/w/en La massima altezza che la scrolled window allocherà per il proprio contenuto
max-content-width int r/w/en La massima larghezza che la scrolled window allocherà per il proprio contenuto
min-content-height int r/w/en La minima altezza che la scrolled window allocherà per il proprio contenuto
min-content-width int r/w/en La minima larghezza che la scrolled window allocherà per il proprio contenuto
overlay-scrolling bool r/w/en Settato a True fa comparire le scrollbar solo con il mouse. False, sempre presenti
propagate-natural-height bool r/w/en Calcola o meno la naturale altezza del child e la propaga alla scrolled window
propagate-natural-width bool r/w/en Calcola o meno la naturale larghezza del child e la propaga alla scrolled window
shadow-type Gtk.ShadowType r/w/en Lo stile dell’angolo attorno ai contenuti
vadjustment Gtk.Adjustment r/w/c Il Gtk.Adjustment relativo alla posizione verticale
vscrollbar-policy Gtk.PolicyType r/w/en la policy che regola quando visualizzare la scrollbar verticale
window-placement Gtk.CornerType r/w/en Dove sono posizionati i contenuti, rispetto alle scrollbars

Metodi

Oltre ai soliti getter e setter relativi alle properties dell’oggetto Gtk.ScrolledWindow,
principali metodi sono:

new(hadjustment, vadjustment)

Crea una nuova scrolled window. I due argomenti sono gli adjustments
della scrolled window e saranno condivisi tra le scrollbars e il child widget in modo da
sincronizzare le scrollbars con il child stesso.
Di solito si passa None per gli adjustments, in modo che la scrolled window
li crei per noi.
Parametri:
hadjustment: l’adjustment (Gtk.Adjustment) orizzontale, o None;
vadjustment: l’adjustment (Gtk.Adjustment) verticale, o None;

get_capture_button_press()

Ritorna True se il click button viene catturato durante il kinetic scrolling.

get_hadjustment()

Ritorna l’adjustment (Gtk.Adjustment) della scrollbar orizzontale, usato per connetterla alla
funzionalità di scroll orizzontale del child widget.

get_hscrollbar()

Ritorna la scrollbar orizzontale della scrolled window.

get_kinetic_scrolling()

Ritorna True se è stato impostato il kinetic scrolling.

get_max_content_height()

Ritorna il valore della massima altezza dedicata dalla scrolled window, ai contenuti.
Se non è stato impostato alcun limite, il metodo ritorna -1.

get_max_content_width()

Ritorna il valore della massima larghezza dedicata dalla scrolled window, ai contenuti.
Se non è stato impostato alcun limite, il metodo ritorna -1.

get_min_content_height()

Ritorna il valore della minima altezza dedicata dalla scrolled window, ai contenuti.
Se non è stato impostato alcun limite, il metodo ritorna -1.

get_min_content_width()

Ritorna il valore della minima larghezza dedicata dalla scrolled window, ai contenuti.
Se non è stato impostato alcun limite, il metodo ritorna -1.

get_overlay_scrolling()

Ritorna True se l’overlay scrolling è abilitato per la scrolled window.
L’overlay scrolling visualizza la scrollbar solo se il puntatore mouse è sopra di essa.
Per averla sempre presente settare la property “overlay-scrolling” a False.

get_placement()

Ritorna il valore dell’enum Gtk.CornerType relativo al posizionamento dei contenuti,
rispetto alle scrollbars.
vedere Gtk.ScrolledWindow.set_placement() per il settaggio.

get_policy()

Ritorna una tupla con i due valori di policy Gtk.PolicyType, settati per le scrollbars
orizzontale e verticale. Vedere Gtk.ScrolledWindow.set_policy() per il settaggio.

get_propagate_natural_height()

Ritorna True se la naturale altezza richiesta dal child, viene propagata sulla
scrolled window.

get_propagate_natural_width()

Ritorna True se la naturale larghezza richiesta dal child, viene propagata sulla
scrolled window.

get_shadow_type()

Ritorna l’enum Gtk.ShadowType settato per la scrolled window, ovvero il tipo di
outline della window.
Vedere Gtk.ScrolledWindow.set_shadow_type(), per il settaggio.

get_vadjustment()

Ritorna l’adjustment (Gtk.Adjustment) della scrollbar verticale, usato per connetterla alla
funzionalità di scroll verticale del child.

get_vscrollbar()

Ritorna la scrollbar verticale della scrolled window.

set_capture_button_press(capture_button_press)

Modifica il comportamento della scrolled window rispetto all’evento iniziale che possibilmente dà
inizio al kinetic scrolling.
Quando capture_button_press viene settato a True, l’evento viene
catturato dalla scrolled window, e quindi ripetuto in seguito se è destinato al child widget.
Questo settaggio ha effetto solo se il kinetic scrolling è abilitato.
Parametri:
capture_button_press: il boolean che settato a True
permette alla scrolled window di catturare i click button;

set_hadjustment(hadjustment)

Setta l’adjustment della scrollbar orizzontale.
Parametri:
hadjustment: l’adjustment da usare o None per
crearne uno nuovo;

set_kinetic_scrolling(kinetic_scrolling)

Abilita/Disabilita il kinetic scrolling. Il kinetic scrolling si applica solo ai dispositivi con
source Gdk.InputSource.TOUCHSCREEN.
Parametri:
kinetic_scrolling: il boolean che abilita/disabilita il kinetic
scrolling;

set_max_content_height(height)

Setta la massima altezza che la scrolled window dovrebbe lasciare visibile.
Non settare tale valore ad uno inferiore al valore della property “min-content-height”.
Parametri:
height: massima altezza (int) dei contenuti visibili;

set_max_content_width(width)

Setta la massima larghezza che la scrolled window dovrebbe lasciare visibile.
Non settare tale valore ad uno inferiore al valore della property “min-content-width”.
Parametri:
width: massima larghezza (int) dei contenuti visibili;

set_min_content_height(height)

Setta la minima altezza che la scrolled window dovrebbe lasciare visibile.
Non settare tale valore ad uno superiore al valore della property “max-content-height”.
Parametri:
height: minima altezza (int) dei contenuti visibili;

set_min_content_width(width)

Setta la minima larghezza che la scrolled window dovrebbe lasciare visibile.
Non settare tale valore ad uno superiore al valore della property “max-content-width”.
Parametri:
height: minima larghezza (int) dei contenuti visibili;

set_overlay_scrolling(overlay_scrolling)

Abilita/Disabilita overlay scrolling per la scrolled window, cioè visualizza la scrollbar solo se
il puntatore mouse è sopra di essa.
Parametri:
overlay_scrolling: il boolean che attiva/disattiva l’overlay
scrolling;

set_placement(window_placement)

Setta il posizionamento dei contenuti (child) rispetto alle scrollbars.
Il valore di default è l’enum Gtk.CornerType.TOP_LEFT, che significa che il child è nell’angolo
in alto a sinistra, con le scrollbars sotto di esso e a destra.
Gli altri valori settabili sono Gtk.CornerType.TOP_RIGHT, Gtk.CornerType.BOTTOM_LEFT e
Gtk.CornerType.BOTTOM_RIGHT.
Parametri:
window_placement: l’enum (Gtk.CornerType) che definisce la
posizione del child rispetto alle scrollbars.

set_policy(hscrollbar_policy, vscrollbar_policy)

Setta le policy di visibilità delle scrollbars orizzontale e verticale.
L’enum che decide quando la scrollbar debba apparire, può assumere i seguenti valori:
Gtk.PolicyType.ALWAYS: la scrollbar è sempre presente;
Gtk.PolicyType.NEVER: la scrollbar non è mai presente;
Gtk.PolicyType.AUTOMATIC: la scrollbar è presente solo se necessario;
Parametri:
hscrollbar_policy: l’enum (Gtk.PolicyType) della policy per la
scrollbar orizzontale;
vscrollbar_policy: l’enum (Gtk.PolicyType) della policy per la
scrollbar verticale;

set_propagate_natural_height(propagate)

Settato a True, calcola l’altezza naturale del child e la propaga attraverso la
scrolled window.
Parametri:
propagate: il boolean che attiva/disattiva la propagazione
dell’altezza del child alla scrolled window;

set_propagate_natural_width(propagate)

Settato a True, calcola la larghezza naturale del child e la propaga attraverso
la scrolled window.
Parametri:
propagate: il boolean che attiva/disattiva la propagazione
della larghezza del child alla scrolled window;

set_shadow_type(type)

Modifica il tipo di shadow attorno al child della scrolled window.
Il valori impostabili, dell’enum Gtk.ShadowType sono:
NONE (0): nessun outline
IN (1): outline smussato verso l’interno;
OUT (2): outline smussato verso l’esterno;
ETCHED_IN (3): outline con aspetto sunken 3d (scavato);
ETCHED_OUT (4): outline con aspetto raised 3d (sporgente);
Parametri:
type: l’enum (Gtk.ShadowType) che disegna il tipo di shadow
attorno al child della scrolled window;

set_vadjustment(vadjustment)

Setta l’adjustment della scrollbar verticale.
Parametri:
vadjustment: l’adjustment da usare o None per
crearne uno nuovo;

unset_placement()

Resetta il placement del child rispetto alle scrollbars. Se non è settato nessun placement per la
scrolled window, di default sarà Gtk.CornerType.TOP_LEFT.
Vedere Gtk.ScrolledWindow.set_placement() e Gtk.ScrolledWindow.get_placement().

Di seguito un codice di esempio:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk


class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="FlowBox Demo")
        self.set_border_width(10)
        self.set_default_size(250, 100)

        header = Gtk.HeaderBar(title="ScrolledWindow example")
        header.set_subtitle("Serie A")
        header.props.show_close_button = True
        self.set_titlebar(header)

        listbox = Gtk.ListBox()
        listbox.set_selection_mode(Gtk.SelectionMode.NONE)
        listbox = Gtk.ListBox()
        teams = ("Inter", "Juventus", "Lazio", "Atalanta", "Roma", "Verona",
                 "Bologna", "Cagliari", "Parma", "Milan", "Napoli", "Sassuolo",
                 "Torino", "Fiorentina", "Udinese", "Sampdoria", "Lecce",
                 "Genoa", "Brescia", "Spal")
        for team in teams:
            listbox.add(Gtk.Label(label=team))

        scrolled = Gtk.ScrolledWindow()
        scrolled.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER,
                            vscrollbar_policy=Gtk.PolicyType.AUTOMATIC)
        scrolled.add(listbox)
        scrolled.set_property("max-content-height", 5)
        scrolled.set_property("overlay-scrolling", True)

        self.add(scrolled)


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 ScrolledWindow

Categorie:Gtk3, PyGObject, python Tag: , ,

PyGobject: Gtk.RadioButton

13 Aprile 2020 Commenti chiusi

torna all’indice degli appunti

RadioButton

Il widget Gtk.RadioButton eredita da Gtk.ToggleButton, ma ha la particolarità di lavorare in gruppo.
In un gruppo di più RadioButtons, solo un RadioButton può essere selezionato, deselezionando di
conseguenza gli altri. Viene generalmente collegato ad una callback che viene invocata quando lo
stesso widget viene premuto e viene di fatto emesso il segnale “toggled”.

Per creare un RadioButton si utilizza il costruttore Gtk.RadioButton(*args, **kwargs),
dove gli argomenti più significativi sono “”label” e “image”.
label: è una stringa di testo visualizzata nel RadioButton
image: un oggetto Gtk.Image che rappresenta l’immagine sul RadioButton.

 
>>> rbutton = Gtk.RadioButton()
>>> rbutton
<Gtk.RadioButton object at 0xb4b9de3c (GtkRadioButton at 0x952b110)>

E’ possibile passare i parametri del widget in fase di costruzione, ma è possibile accedervi e
modificarli anche in seguito, utilizzando i metodi getter e setter
get_property(property_name) e set_property(property_name, property_value):

 
>>> rbutton.get_property("label")
>>> rbutton.set_property("label", "Button 1")
>>> rbutton.get_property("label")
'Button 1'

oppure con i metodi getter e setter specifici get_*property_name*() e
set_*property_name*(value):

 
>>> rbutton.set_label("RadioButton 1")
>>> rbutton.get_label()
'RadioButton 1'

La property principale, oltre a quelle ereditate dai vari widget, come ad esempio Gtk.ToggleButton
e Gtk.Button, sono:

Name Type Flags Short Description
group Gtk.RadioButton w il gruppo di radio button a cui appartiene questo widget

Segnali

Per connettere un widget ad una callback, in modo che, quando viene emesso un segnale specifico,
quest’ultima venga invocata, si utilizza il metodo connect(signal, callback).
Il segnale che fondamentalmente interessa il radiobutton è “toggled” e viene emesso quando un
radiobutton, che precedentemente non era selezionato, viene cliccato (clicked()).
Per conoscere lo stato di un radiobutton, si utilizza il metodo get_active()

 
>>> def on_button_toggled(button):
...     if button.get_active():
...         state = "on"
...     else:
...         state = "off"
...     print("{} was turned {}".format(button.get_label(), state))
...     
>>> button1 = Gtk.RadioButton.new_with_label_from_widget(None, "Button 1")
>>> button2 = Gtk.RadioButton.new_with_label_from_widget(button1, "Button 2")
>>> button1.connect("toggled", on_button_toggled)
60
>>> button2.connect("toggled", on_button_toggled)
61
>>> button1.toggled()
Button 1 was turned on
>>> button1.get_active()
True
>>> button2.get_active()
False
>>> button2.clicked()
Button 1 was turned off
Button 2 was turned on
>>> button1.clicked()
Button 2 was turned off
Button 1 was turned on

Image

Per inserire un’immagine all’interno del widget, creiamo prima un oggetto Gtk.Image e lo settiamo
nel widget che lo conterrà. Per recuperarla, si userà il getter specifico get_image()

 
>>> image = Gtk.Image.new_from_file("OK24.png")
>>> button1.set_image(image)
>>> button1.get_image() == image
True

Metodi

Per creare un RadioButton, esistono due metodi “scorciatoia”, new_from_widget(radio_group_member)
e new_with_label_from_widget(radio_group_member, label):

“radio_group_member”: ovviamente è il widget già presente nel gruppo del quale vogliamo che il radiobutton faccia parte;
“label”: è il testo del radiobutton;
Ovviamente il primo elemento del gruppo, non avrà widget di riferimento, quindi il l’argomento “radio_group_member” sarà None.

>>> button1 = Gtk.RadioButton.new_with_label_from_widget(radio_group_member=None, label="Button 1")
>>> button2 = Gtk.RadioButton.new_from_widget(radio_group_member=button1)
>>> button1.get_group() == button2.get_group()
True

Di seguito i metodi utilizzabili con il widget Gtk.RadioButton:

new(group)

Metodo costruttore che crea un nuovo Gtk.RadioButton.
Parametri:
group: un gruppo di radiobutton esistenti ([Gtk.RadioButton, ]),
o None, se stiamo crando un nuovo gruppo;

new_from_widget(radio_group_member)

Metodo costruttore che crea un nuovo Gtk.RadioButton, aggiungendolo allo stesso gruppo di
radio_group_member, che è un Gtk.RadioButton esistente.
Parametri:
radio_group_member: un Gtk.RadioButton esistente;

new_with_label(group, label)

Metodo costruttore che crea un nuovo Gtk.RadioButton con una label di testo associata.
Parametri:
group: un gruppo di radiobutton esistenti ([Gtk.RadioButton, ]),
o None, se stiamo crando un nuovo gruppo;
label: il testo visualizzato a fianco del radiobutton

new_with_label_from_widget(radio_group_member, label)

Metodo costruttore che crea un nuovo Gtk.RadioButton con una label di testo aggiungendolo allo
stesso gruppo a cui appartiene radio_group_member.
Parametri:
radio_group_member: un Gtk.RadioButton esistente;
label: il testo visualizzato a fianco del radiobutton;

new_with_mnemonic(group, label)

Metodo costruttore che crea un nuovo Gtk.RadioButton contenente una label con mnemonic,
aggiungendolo al gruppo specificato. La Label sarà creata usando Gtk.Label.new_with_mnemonic(),
in modo tale che la sottolineatura nella label, indichi il “mnemonic” del radiobutton.
Parametri:
group: un gruppo di radiobutton esistenti ([Gtk.RadioButton, ]),
o None, se stiamo crando un nuovo gruppo;
label: il testo visualizzato a fianco del radiobutton, comprensivo
di sottolineature identificanti gli “mnemonic” del radiobutton;

new_with_mnemonic_from_widget(radio_group_member, label)

Metodo costruttore come il precedente, ma il primo parametro non sarà un gruppo, ma un
Gtk.RadioButton, dal quale attingere il gruppo. Passando None, verrà creato un nuovo gruppo.
Parametri:
radio_group_member: un Gtk.RadioButton esistente;
label: il testo visualizzato a fianco del radiobutton, comprensivo
di sottolineature identificanti gli “mnemonic” del radiobutton;

get_group()

Ritorna il gruppo assegnato al RadioButton, ovvero una lista di radiobuttons dello stesso gruppo:

 
>>> button1.get_group()
[<Gtk.RadioButton object at 0xb4b44fa4 (GtkRadioButton at 0x9ba8220)>, <Gtk.RadioButton object at 0xb72407d4 (GtkRadioButton at 0x9ba8100)>]
>>> button1.get_group() == button2.get_group()
True

join_group(group_source)

Unisce un Gtk.RadioButton al gruppo di un altro Gtk.RadioButton.
Parametri:
group_source: un oggetto Gtk.RadioButton al cui gruppo vogliamo unire
il radiobutton corrente. Passando None, il radiobutton corrente viene rimosso dall’eventuale
gruppo di appartenenza.

 
>>> button3 = Gtk.RadioButton.new()
>>> button3.set_label("Button 3")
>>> button3.get_group()
[<Gtk.RadioButton object at 0xb355c284 (GtkRadioButton at 0x9ba8340)>]
>>> button3.join_group(button1)
>>> for b in button3.get_group():
...     print(b.get_label())
...     
Button 3
Button 2
Button 1

set_group(group)

Setta il gruppo del Gtk.RadioButton. Attenzione che questo non modificherà automaticamente il
layout della nostra interfaccia, quindi per mostrare questa modifica, sarà necessario riadattare
l’interfaccia stessa.
Parametri:
group: un gruppo di radiobutton esistente, o None.

toggled()

emette un segnale di tipo “toggled”.

clicked()

emette un segnale di tipo “clicked”.

Di seguito un codice d’esempio:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk


class GWindow(Gtk.Window):
    def __init__(self, controller=None):
        self.controller = controller
        super().__init__(title="RadioButton Demo")
        self.set_border_width(10) # sets space around the inner widget (hbox)

        hbox = Gtk.Box(spacing=6)
        self.add(hbox)

        image = Gtk.Image.new_from_file("OK24.png")
        button1 = Gtk.RadioButton.new_with_label_from_widget(None, "Button 1")
        button1.set_image(image)

        button2 = Gtk.RadioButton.new_from_widget(button1)
        button2.set_label("Button 2")
        button3 = Gtk.RadioButton.new_with_label_from_widget(button1,
                                                             "Button 3")
        # Bindings
        button1.connect("toggled", self.on_button_toggled)
        button2.connect("toggled", self.on_button_toggled)
        button3.connect("toggled", self.on_button_toggled)
        # Layout
        hbox.pack_start(button1, False, False, 0)
        hbox.pack_start(button2, False, False, 0)
        hbox.pack_start(button3, False, False, 0)

    def on_button_toggled(self, button):
        if button.get_active():
            state = "on"
        else:
            state = "off"
        print("{} was turned {}".format(button.get_label(), state))


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 RadioButton

Categorie:Gtk3, PyGObject, python Tag: , ,

PyGObject: Gtk.ProgressBar

13 Aprile 2020 Commenti chiusi

torna all’indice degli appunti

ProgressBar

Il widget Gtk.ProgressBar è un widget utilizzato per visualizzare il progresso di un’operazione
di lunga durata. La progressbar può essere utilizzata in due modi, percentage
per visualizzare lo stato di avanzamento progressivo dell’operazione e activity,
per visualizzare un cursore rimbalzante.
Quando dobbiamo visualizzare lo stato di un’operazione dall’esito certo, ad esempio il download di
un file di grandezza nota, possiamo utilizzare la progressbar in percentage mode.
Questo richiede il periodico richiamo del metodo Gtk.ProgressBar.set_fraction(),
per aggiornare lo stato della progressbar.
Se invece non conosciamo l’ammontare del carico di lavoro, possiamo utilizzare una progressbar
in activity mode, il chè richiede la chiamata periodica al metodo
Gtk.ProgressBar.pulse(), che mostra un cursore che fa avanti e indietro indefinitivamente.

Per creare un ProgressBar si utilizza il costruttore Gtk.ProgressBar(**kwargs).

Le properties della progressbar sono le seguenti:

Name Type Flags Short Description
ellipsize Pango.EllipsizeMode r/w/en l’oggetto Pango.EllipsizeMode che indica dove applicare l’ellipse (“…”) sulla stringa
fraction float r/w/en la porzione completata della progressbar
inverted bool r/w/en un boolean che settato a True, inverte la direzione della progress bar (da destra verso sinistra)
pulse-step float r/w/en la porzione di progressbar da utilizzare come blocco in activity-mode (avanti e indietro)
show-text bool r/w/en un boolean che settato a True permette di mostrare un testo sulla progressbar
text str r/w la stringa di testo da visualizzare sulla progressbar

E’ possibile settare le properties del widget successivamente alla sua costruzione, con i soliti metodi getter e setter
get_property(property_name) e set_property(property_name, property_value):

 
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk, GLib, Gdk
>>> progressbar = Gtk.ProgressBar()
>>> progressbar.set_property("text", "progress 0%")
>>> progressbar.get_property("text")
'progress 0%'

oppure con i metodi getter e setter specifici get_*property_name*() e
set_*property_name*(value):

 
>>> progressbar.get_inverted()
False
>>> progressbar.set_inverted(True)
>>> progressbar.get_inverted()
True

Metodi

Di seguito i metodi utilizzabili con il widget Gtk.ProgressBar:

new()

Metodo costruttore che crea un nuovo oggetto Gtk.ProgressBar.

get_ellipsize()

Ritorna l’oggetto Pango.EllipsizeMode con la posizione dell’ellipse (“…”)
utilizzata sulla stringa.

get_fraction()

Ritorna una frazione da 0.0 a 1.0 indicante la quantità di lavoro completato.

get_inverted()

Ritorna True se la progressbar è invertita, ovvero si riempie da destra verso sinistra.

get_pulse_step()

Ritorna la frazione utilizzata per il blocco in movimento nella activity mode.

get_show_text()

Ritorna True se il testo viene visualizzato nella progressbar.

get_text()

Ritorna il testo visualizzato nella progressbar, se presente, altrimenti ritorna None.

pulse()

Indica che un progresso indefinito è stato fatto, ma non è dato sapere quanto.
La chiamata a questo metodo causa l’entrata dell progressbar nell’ activity mode
(con un blocco che rimbalza avanti e indietro).
Ogni chiamata al metodo Gtk.ProgressBar.pulse() causa un piccolo spostamento del blocco e
questo piccolo spostamento viene settato con il metodo Gtk.ProgressBar.set_pulse_step().

set_ellipsize(mode)

Setta la posizione dell’ellipse da applicare al testo, quando non c’è abbastanza spazio per
visualizzare tutta la stringa.
Parametri:
mode: è un Enum Pango.EllipsizeMode
che definisce dove posizionare l’ellipse, e può assumere i seguenti valori:
NONE (0): nessuna ellipsization;
START (1): omette i caratteri all’inizio del testo;
MIDDLE (2): omette i caratteri a centro testo;
END (3): omette i caratteri alla fine del testo;

set_fraction(fraction)

Definisce il riempimento della progress bar, indicando cioè la frazione di lavoro completato
rispetto al totale previsto.
Parametri:
fraction: è il float che indica quanto lavoro è stato completato
e va da 0.0 (vuota) a 1.0 (piena) inclusi.

set_inverted(inverted)

Inverte il senso di riempimento della progressbar, partendo da destra e riempendosi verso sinistra.
Parametri:
inverted: è il boolean che settato a True, inverte la progressbar;

set_pulse_step(fraction)

Setta la frazione di progressbar da utilizzare come blocco in movimento in activity mode.
Parametri:
fraction: il float che indica che frazione di progressbar utilizzare per il blocco in movimento. Va da 0.0 a 1.0;

set_show_text(show_text)

Setta se mostrare o meno il testo nella progressbar.
Parametri:
show_text: è il boolean che settato a True mostra il testo nella
progressbar;

set_text(text)

Setta il testo da visualizzare nelle progressbar.
Se text=None e la property di Gtk.ProgressBar “show-text”=True, verrà visualizzato al posto del
testo, il valore corrente della property “fraction”.
Parametri:
text: il testo da visualizzare nella progressbar o None;

Di seguito un codice d’esempio:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib


class GWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="ProgressBar example")
        self.value = 0
        self.set_default_size(400, 100)
        self.set_border_width(10)

        self.progressbar = Gtk.ProgressBar()
        self.progressbar.set_text("progress {}%".format(self.value))
        self.progressbar.set_show_text(True)
        self.button = Gtk.ToggleButton(label="Start")
        # bindings
        self.button.connect("toggled", self.on_toggle)
        # layout
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        vbox.pack_start(self.button, True, True, 0)
        vbox.pack_start(self.progressbar, True, True, 0)
        self.add(vbox)

    def on_toggle(self, button):
        GLib.timeout_add(50, self.on_timeout, 1.0)

    def on_timeout(self, new_value):
        if self.button.get_active():
            self.button.set_label("Stop")
            self.value = self.progressbar.get_fraction() + new_value/100
            self.progressbar.set_text("progress {}%".format(
                int(self.value*100)))
            if self.value > 1:
                self.value = 0
            self.progressbar.set_fraction(self.value)
            return True  # chiamo di nuovo la callback on_timeout
        else:
            self.button.set_label("Start")
            return False  # fermo la chiamata alla callback


if __name__ == "__main__":
    win = GWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

In questo codice vediamo questa riga di codice particolare

GLib.timeout_add(50, self.on_timeout, 1.0)

La funzione di GLib timeout_add(time, callback, *args), permette di invocare una
callback dopo un determinato intervallo di tempo.
Questa callback viene richiamata fino a che non viene ritornato False.
Parametri:
time: è l’intervallo di tempo in millisecondi;
callback: è la funzione da chiamare;
*args: sono gli argomenti facoltativi da passare alla callback;

Qui sono reperibili le GLib functions.

Aspetto

Se volessimo modificare l’aspetto del widget, sarà possibile farlo ricorrendo a CSS.
Qui entrano in gioco 3 oggetti:
Gdk.Screen
Gtk.CssProvider
Gtk.StyleContext

L’oggetto Gdk.Screen viene utilizzato per specificare su quale Screen la top-level
window deve essere visualizzata.
CssProvider è un oggetto che implementa l’interfaccia Gtk.StyleProvider
e permette il parse di una stringa CSS-like, utilizzabile per personalizzare i widget.
Gtk.StyleContext memorizza le informazioni riguardanti la personalizzazione dei
widget e si occupa in tal senso, di chiedere le informazioni necessarie al Gtk.StyleProvider
collegato ad esso. L’iter è il seguente:
– si crea un’istanza di Gdk.Screen con il classmethod get_default(),
che ritorna lo screen di default per il display di default;
– si crea un’istanza di Gtk.CssProvider ed una di Gtk.StyleContext;
– Chiamiamo il metodo Gtk.StyleContext.add_provider_for_screen(screen, provider, priority),
con il quale associamo un global style-provider allo screen e decidendone la priorità.
Infine diciamo al provider di caricare la stringa CSS da parsare:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib, Gdk


class GWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="ProgressBar example")
        self.value = 0
        self.set_default_size(400, 100)
        self.set_border_width(10)

        self.progressbar = Gtk.ProgressBar()
        self.progressbar.set_text("progress {}%".format(self.value))
        self.progressbar.set_show_text(True)
        css = b"""
                trough {
                    min-height: 20px;
                    border: none;
                        }
                text {
                    color: grey;
                    font: 12px Verdana;
                     }
                progress {
                    border: none;
                    background-color: grey;
                    min-height: 20px;
                         }
                """
        screen = Gdk.Screen.get_default()
        provider = Gtk.CssProvider()
        style_context = Gtk.StyleContext()
        style_context.add_provider_for_screen(
            screen, provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )
        provider.load_from_data(css)
        self.button = Gtk.ToggleButton(label="Start")
        # bindings
        self.button.connect("toggled", self.on_toggle)
        # layout
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        vbox.pack_start(self.button, True, True, 0)
        vbox.pack_start(self.progressbar, True, True, 0)
        self.add(vbox)

    def on_toggle(self, button):
        GLib.timeout_add(50, self.on_timeout, 1.0)

    def on_timeout(self, new_value):
        if self.button.get_active():
            self.button.set_label("Stop")
            self.value = self.progressbar.get_fraction() + new_value/100
            self.progressbar.set_text("progress {}%".format(
                int(self.value*100)))
            if self.value > 1:
                self.value = 0
            self.progressbar.set_fraction(self.value)
            return True  # chiamo di nuovo la callback on_timeout
        else:
            self.button.set_label("Start")
            return False  # fermo la chiamata alla callback


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 ProgressBar

Categorie:Gtk3, PyGObject, python Tag: , ,

PyGObject: Gtk.Popover

13 Aprile 2020 Commenti chiusi

torna all’indice appunti

Popover

Il widget Gtk.Popover è una window contestuale che contiene opzioni o informazioni.
I Popovers vengono allegati ad un widget, passati in fase di costruzione su Gtk.Popover.new(),
o aggiornati successivamente con il metodo Gtk.Popover.set_relative_to().
Di default punteranno all’intera area del widget, ma tale comportamento può essere modificato con
il metodo Gtk.Popover.set_pointing_to().
La posizione di un popover relativamente al widget al quale è allegato, può anche essere cambiata
con il metodo Gtk.Popover.set_position().
Di default, il Gtk.Popover esegue un GTK+ grab, per assicurarsi gli input events
fintanto che rimane visualizzato, mentre scompare quando si clicca nell’area circostante ad esso,
o viene premuto il tasto Esc.
Se non si desidera un comportamento “modal” sul popover, è possibile utilizzare il metodo
Gtk.Popover.set_modal() per modificarlo, settando infatti a False, il popover non
eseguirà un GTK+ grab sugli input events.

Le properties principali sono:

Name Type Flags Short Description
constrain-to Gtk.PopoverConstraint r/w/en costringe il popover nella posizione data
modal bool r/w/en Setta il popover in modalità modal (esegue Gtk+ grab sugli input events)
pointing-to Gdk.Rectangle r/w dove punta la bubble window del popover
position Gtk.PositionType r/w/en dove posizionare la bubble window del popover
relative-to Gtk.Widget r/w Il Widget al quale la bubble window punta

Segnali

Name Short Description
closed viene emesso quando il popover viene dismesso

Metodi

Oltre ai soliti getter e setter relativi alle properties dell’oggetto Gtk.Popover, i principali
metodi sono:

add(widget)

Ereditato da Gtk.Container, aggiunge un widget al popover.
Questo widget a sua volta può essere un contenitore di altri widgets.
Parametri:
widget: l’oggetto Gtk.Widget da inserire nel popover;

new(relative_to)

Crea un nuovo oggetto Gtk.Popover che punterà al widget relative_to.
Parametri:
relative_to: l’oggetto Gtk.Widget al quale il popover farà riferimeno;

new_from_model(relative_to, model)

Crea un nuovo oggetto Gtk.Popover che punterà al widget relative_to e lo popola
in accordo con l’oggetto model. I buttons creati sono connessi alle actions
trovate nel Gtk.ApplicationWindow al quale il popover appartiene
Parametri:
relative_to: il Gtk.Widget al quale si riferisce il popover;
model: un Gio.MenuModel;

bind_model(model, action_namespace)

Stabilisce una connessione tra un Gtk.Popover e un Gio.MenuModel.
I contenuti del popover vengono rimossi e ripopolati in accordo con gli elementi del model.
Quando il model cambia, il popover si aggiorna.
Se si chiama questo metodo due volte con differenti models, il primo binding verrà rimpiazzato
dal secondo. Se il model è None ogni binding precedente viene eliminato e tutti
i children rimossi. Se action_namespace esiste (diverso da None) allora tutte le
azioni menzionate nel model avranno un prefisso, ad esempio l’azione “quit” con action_namespace
“app”, avrà un nome effettivo uguale a “app.quit”.
Questa funzione utilizza Gtk.Actionable per definire il nome della action e i target
values sugli elementi creati nel menu. Se vogliamo usare un action group diverso da “app” e “win”,
dobbiamo aggiungere il nostro action group personalizzato alla gerarchia di widget, usando il
metodo Gtk.Widget.insert_action_group(), ad esempio se creiamo un action_group
“mygroup”, la action “info” ad esso relativa, nel nostro oggetto Gio.MenuModel,
avrà un nome “mygroup.quit”.
Parametri:
model: il Gio.MenuModel a cui legarsi o None per non avere binding;
action_namespace: il namespace per le actions nel model;

get_constrain_to()

Ritorna l’oggetto Gtk.PopoverConstraint per il
piazzameno del popover. Il PopoverConstraint è un enum che descrive i vincoli per il
posizionamento del popover. Può assumere due valori:
NONE (0): non vincola il posizionamento del popover;
WINDOW (1): vincola il posizionamento ai margini della window alla quale il popover è allegato;

get_default_widget()

Ritorna il widget che dovrebbe essere settato come default mentre il popover viene visualizzato,
o None se non presente.

get_modal()

Ritorna True se il popover è impostato come modal, ovvero esegue
il Gtk+ grab sugli input events, come il click sull’area circostante al popover,
o la pressione del tasto Esc.

get_pointing_to()

Ritorna True, se è stato settato un oggetto Gdk.Rectangle
al quale popover deve puntare (vedere il metodo set_pointing_to()) e il Gdk.Rectangle
corrispondente, altrimenti False con il Gdk.Rectangle relativo al widget al quale è stato
allegato il popover.

>>> popover1 = Gtk.Popover()
>>> popover1.get_pointing_to()
(False, rect=<Gdk.Rectangle object at 0x0000000003c011c0 (GdkRectangle at 0x00000000049451c0)>)

get_position()

Ritorna la posizione del popover. La posizione è un oggetto di tipo Gtk.PositionType

get_relative_to()

Ritorna il widget al quale il popover è stato allegato

>>> button = Gtk.Button.new_with_label("Click Me")
>>> popover.set_relative_to(button)
>>> popover.get_relative_to().get_label()
'Click Me'

popdown()

Nasconde il popover menu mediante transizione.
Non è la stessa cosa che chiamare il metodo Gtk.Widget.hide()

popup()

Visualizza il popover mediante transizione.
Non è la stessa cosa che chiamare il metodo Gtk.Widget.show()

set_constrain_to(constraint)

Setta un vincolo per il posizionamento del popover.
Parametri:
constraint: un oggetto Gtk.PopoverConstraint.
Il PopoverConstraint è un enum che descrive i vincoli per il posizionamento del popover.
Può assumere due valori:
NONE (0): non vincola il posizionamento del popover;
WINDOW (1): vincola il posizionamento ai margini della window alla quale il popover è allegato;

set_default_widget(widget)

Setta il widget che dovrebbe essere settato come default quando il popover viene visualizzato.
Il popover tiene traccia del precedente widget di default, che ripristinerà una volta che il
popover stesso scomparirà.
Parametri:
widget: il nuovo widget di default da usare mentre il popover
viene visualizzato, o None;

set_modal(modal)

Setta il popover come modal, ovver lo stesso reclamerà tutti gli input events all’interno della
top level window (Gtk+ grab)

set_pointing_to(rect)

Setta il rettangolo (trasparente) al quale punterà il popover con il suo indicatore.
Parametri:
rect: un oggetto Gdk.Rectangle a cui puntare

>>> import gi
... gi.require_version('Gtk', '3.0')
>>> from gi.repository import Gtk, Gdk
>>> popover = Gtk.Popover()
>>> rect = Gdk.Rectangle()
>>> rect.x = 50
... rect.y = 50
... rect.height = 200
>>> popover.set_pointing_to(rect)

set_position(position)

Setta la posizione desiderata dove far apparire il popover.
Questa posizione viene rispettata quando lo spazio lo consente.
Parametri:
position: un enum di tipo Gtk.PositionType che indica la
posizione desiderata per il popover;

set_relative_to(relative_to)

Setta un nuovo widget al quale allegare il popover.
Parametri:
relative_to: il widget al quale allegare il popover;

Di seguito un codice di esempio:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk


class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Popover Demo")
        self.set_border_width(10)
        self.set_default_size(400, 200)

        button = Gtk.Button.new_with_label("Click Me")
        pop_open_button = Gtk.ModelButton(label="Open")
        pop_quit_button = Gtk.ModelButton(label="Quit")
        # layout
        hbox = Gtk.Box(spacing=6, orientation=Gtk.Orientation.VERTICAL)
        hbox.pack_start(button, False, True, 0)
        popover_vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        popover_vbox.pack_start(pop_open_button, False, True, 10)
        popover_vbox.pack_start(pop_quit_button, False, True, 10)
        self.popover = Gtk.Popover()
        self.popover.add(popover_vbox)  # add a container 
        self.popover.set_position(Gtk.PositionType.BOTTOM)
        self.add(hbox)
        # bindings
        button.connect("clicked", self.on_click)
        pop_open_button.connect("clicked", self.on_popover_open)
        pop_quit_button.connect("clicked", self.on_popover_quit)
        self.popover.connect("closed", self.popover_dismissed)

    def popover_dismissed(self, popover):
        print("INFO: Popover dismissed!")

    def on_click(self, button):
        self.popover.set_relative_to(button)
        self.popover.show_all()
        self.popover.popup()

    def on_popover_open(self, button):
        print("INFO: '%s' button was clicked" % button.get_label())

    def on_popover_quit(self, button):
        Gtk.main_quit()


if __name__ == "__main__":
    win = GWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

Gtk.Popover al posto dei menu

Il Gtk.Popover è spesso usato come alternativa ai menu e viene popolato da un Gio.MenuModel,
usando il metodo Gtk.Popover.new_from_model().
In aggiunta a tutte le caratteristiche di un menu model, questo metodo supporta la renderizzazione
di icon buttons, al posto dei classici elementi del menu.
Per sfruttare questa caratteristica, nella stringa XML, settare l’attributo “display-hint” della
sezione a horizontal-buttons e settare le icone degli elementi del menu con
l’attributo “verb-icon”.

<section>
  <attribute name="display-hint">horizontal-buttons</attribute>
  <item>
    <attribute name="label">Cut</attribute>
    <attribute name="action">app.cut</attribute>
    <attribute name="verb-icon">edit-cut-symbolic</attribute>
  </item>
  <item>
    <attribute name="label">Copy</attribute>
    <attribute name="action">app.copy</attribute>
    <attribute name="verb-icon">edit-copy-symbolic</attribute>
  </item>
  <item>
    <attribute name="label">Paste</attribute>
    <attribute name="action">app.paste</attribute>
    <attribute name="verb-icon">edit-paste-symbolic</attribute>
  </item>
</section>

Ecco un codice di esempio con entramni i casi di popover:

import sys

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gio, Gtk


MENU_XML = """
<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <menu id="app-menu">
    <section>
        <item>
            <attribute name="label">About</attribute>
            <attribute name="action">app.about</attribute>
        </item>
        <item>
            <attribute name="label">Quit</attribute>
            <attribute name="action">app.quit</attribute>
        </item>
    </section>
  </menu>
  <menu id="app-menu-icon">
    <section>
    <attribute name="display-hint">horizontal-buttons</attribute>
        <item>
            <attribute name="label">Cut</attribute>
            <attribute name="action">app.cut</attribute>
            <attribute name="verb-icon">edit-cut-symbolic</attribute>
        </item>
        <item>
            <attribute name="label">Copy</attribute>
            <attribute name="action">app.copy</attribute>
            <attribute name="verb-icon">edit-copy-symbolic</attribute>
        </item>
    </section>
  </menu>
</interface>
"""


class AppWindow(Gtk.ApplicationWindow):
    def __init__(self, *args, **kwargs):
        print("OK")
        super().__init__(*args, **kwargs)
        self.set_default_size(300, 200)
        self.set_border_width(50)

        outerbox = Gtk.Box(spacing=6, orientation=Gtk.Orientation.VERTICAL)
        self.add(outerbox)

        builder = Gtk.Builder.new_from_string(MENU_XML, -1)

        menu = builder.get_object("app-menu")
        button = Gtk.MenuButton.new()
        popover = Gtk.Popover.new_from_model(button, menu)
        button.set_popover(popover)

        menu_icon = builder.get_object("app-menu-icon")
        button_icon = Gtk.MenuButton.new()
        popover_icon = Gtk.Popover.new_from_model(button_icon, menu_icon)
        button_icon.set_popover(popover_icon)
        # layout
        outerbox.pack_start(button, False, True, 0)
        outerbox.pack_start(button_icon, False, True, 0)
        self.show_all()


class Application(Gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, application_id="org.example.myapp", **kwargs)
        self.window = None

    def do_startup(self):
        Gtk.Application.do_startup(self)

        action = Gio.SimpleAction.new("about", None)
        action.connect("activate", self.on_about)
        self.add_action(action)

        action = Gio.SimpleAction.new("quit", None)
        action.connect("activate", self.on_quit)
        self.add_action(action)

        for xml_name in ("cut", "copy"):
            action = Gio.SimpleAction.new(xml_name, None)
            action.connect("activate", self.on_icon)
            self.add_action(action)

    def do_activate(self):
        if not self.window:
            self.window = AppWindow(application=self, title="Main Window")
        self.window.present()

    def on_about(self, action, param):
        about_dialog = Gtk.AboutDialog(transient_for=self.window, modal=True)
        about_dialog.run()
        about_dialog.destroy()

    def on_icon(self, action, param):
        print("INFO: '%s' selected!" % action.get_name())

    def on_quit(self, action, param):
        self.quit()


if __name__ == "__main__":
    app = Application()
    app.run(sys.argv)

link di riferimento:

torna all’indice degli appunti
Gtk3 Popover

Categorie:Gtk3, PyGObject, python Tag: , ,

PyGObject: Gtk.MenuBar

13 Aprile 2020 Commenti chiusi

torna all’indice appunti

MenuBar

GTK+ mette a disposizione 2 diversi tipi di menu, Gtk.MenuBar
e Gtk.Toolbar.
Gtk.MenuBar è la barra dei menu standard che contiene una o più istanze di Gtk.MenuItem,
o una delle sue sottoclassi.
Il widget Gtk.Toolbar invece, è la toolbar classica contenente i bottoni che
permettono un accesso rapido alle funzioni più comuni gestite da una applicazione, ad esempio
“new document”, “print page”, “undo”. Contiene una o più istanze di Gtk.ToolItem,
o una delle sue sottoclassi.

Le properties principali sono:

Name Type Flags Short Description
child-pack-direction Gtk.PackDirection r/w/en La direzione di impacchettamento dei child nella menubar
pack-direction Gtk.PackDirection r/w/en La direzione di impacchettamento della menubar

Metodi

Oltre ai soliti getter e setter relativi alle properties dell’oggetto Gtk.MenuBar,
i principali metodi sono:

new()

Crea un nuovo oggetto Gtk.MenuBar

new_from_model(model)

Crea un nuovo oggetto Gtk.MenuBar e lo popola con gli elementi e i sottomenu ricavati dal model.
Gli elementi del menu creati sono connessi alle actions trovate nel Gtk.ApplicationWindow
al quale la menubar appartiene.
Parametri:
model: l’oggetto Gio.MenuModel dal quale estrapoliamo gli elementi
per popolare la menubar;

get_child_pack_direction()

Ritorna l’oggetto Gtk.PackDirection che rappresenta come i widget debbano essere
impacchettati all’interno di un child, nella menubar.

get_pack_direction()

Ritorna l’oggetto Gtk.PackDirection che rappresenta come gli elementi debbano
essere impacchettati nella menubar.

set_child_pack_direction(child_pack_dir)

Setta il modo in cui i widget debbano essere impacchettati all’interno di un child, nella menubar.
Parametri:
child_pack_dir: l’oggetto Gtk.PackDirection che indica il senso
di impacchettamento;

set_pack_direction(pack_dir)

Setta il modo in cui gli elementi debbano essere impacchettati nella menubar.
Parametri:
pack_dir: l’oggetto Gtk.PackDirection che indica il senso
di impacchettamento;

Actions

Le Actions rappresentano le operazioni che un utente può eseguire. Si crea una action creando
un’istanza della classe Gio.SimpleAction,
la si connette al segnale “activate”, cosicchè possa essere invocata una callback di riferimento.
Le actions, per comodità di organizzazione, possono essere mappate in widget
Gio.ActionMap, che permettono di mappare le diverse actions,
appartenenti a diversi gruppi, con l’utilizzo di un prefisso identificativo (ad esempio
“app.action_name” o “win.action_name”).

Come si crea il menu di una applicazione?
Si può effettuare in due modi, o creando un’istanza di Gio.Menu
e aggiungendo ad essa i vari oggetti Gio.MenuItem,
o leggendo da una stringa XML e costruendo il menu tramite Gtk.Builder.

Gio.Menu

Gio.Menu è una semplice implementazione di Gio.MenuModel ovvero un oggetto
rappresenta il contenuto di un menu, con una lista ordinata di elementi, che a loro volta
rappresentano le voci del menu. Ognuno di questi elementi è associato ad una action, che viene
attivata attraverso l’elemento stesso. L’oggetto Gio.Menu viene di fatto popolato da istanze di
Gio.MenuItem (gli elementi della lista).
Lo stesso Gio.Menu mette a disposizione metodi scorciatoia molto comodi che permettono di inserire
direttamente gli elementi, senza prima creare le istanze di Gio.MenuItem.
Ad esempio per inserire un elemento standard, possiamo usare il metodo Gio.Menu.insert(),
per aggiungere una sezione, il metodo Gio.Menu.insert_section(), mentre per
inserire un sottomenu, il metodo Gio.Menu.insert_submenu().

L’iter più esplicito consiste invece nel:

1. Si crea l’istanza Gio.Menu che rappresenta il menu model del sistema di menu;

>>> menu_model = Gio.Menu.new()

2. Si crea l’istanza di Gio.Menu, che rappresenta la voce di menu nella menubar,
cioè “File” (sottomenu del menumodel) e la si aggiunge al menu model;

>>> menu_model = Gio.Menu.new()
>>> menu_model.append_submenu('File', menu_file)

3. Si crea l’istanza di Gio.MenuItem, che rappresenta il primo elemento del menu
“File”, cioè “New” e la si aggiunge al menu “File”;

>>> file_new = Gio.MenuItem.new('New', 'win.FileNew')
>>> menu_file.append_item(file_new)

4. Si crea la Action che corrisponderà alla voce di menu che abbiamo creato, e
che si attiverà cliccando sulla voce stessa;

>>> action_file = Gio.SimpleAction.new(name='FileNew', parameter_type=None)

5. Si aggiunge la action all’istanza di Gtk.ApplicationWindow con il metodo
add_action(action);

6. Si connette la action alla callback desiderata;

Ecco un codeice di esempio:

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gio


class AppWindow(Gtk.ApplicationWindow):
    def __init__(self):
        super().__init__()
        self.set_default_size(200, 100)
        # actions
        act_file = Gio.SimpleAction.new(name='FileNew', parameter_type=None)
        act_quit = Gio.SimpleAction.new(name='FileQuit', parameter_type=None)
        act_info = Gio.SimpleAction.new(name='AboutInfo', parameter_type=None)
        self.add_action(act_file)
        self.add_action(act_quit)
        self.add_action(act_info)
        # model menu
        menu_model = Gio.Menu.new()
        # 1st menu
        menu_file = Gio.Menu.new()
        file_new = Gio.MenuItem.new('New', 'win.FileNew')
        file_quit = Gio.MenuItem.new('Quit', 'win.FileQuit')
        menu_file.append_item(file_new)
        menu_file.append_item(file_quit)
        # 2nd menu
        menu_about = Gio.Menu.new()
        about_info = Gio.MenuItem.new('Info', 'win.AboutInfo')
        menu_about.append_item(about_info)

        menu_model.append_submenu('File', menu_file)
        menu_model.append_submenu('About', menu_about)

        menu_bar = Gtk.MenuBar.new_from_model(menu_model)

        # layout
        layout = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        layout.pack_start(menu_bar, False, False, 0)
        self.add(layout)
        # bindings
        act_file.connect('activate', self.on_menu)
        act_quit.connect('activate', self.on_quit)
        act_info.connect('activate', self.on_menu)
        self.connect('destroy', Gtk.main_quit)

    def on_menu(self, action, value):
        print("INFO: menu '%s'" % action.props.name)

    @staticmethod
    def on_quit(action, param):
        Gtk.main_quit()


if __name__ == '__main__':
    win = AppWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

Gtk.Builder e XML

La stessa cosa si ottiene anche via Gtk.Builder.
Gtk.Builder è un oggetto che legge le descrizioni di una UI da un testo e ne istanzia gli oggetti
descritti in esso.
A grandi linee, all’interno del testo, gli oggetti del menu saranno così identificati:

UI ovvero l’interfaccia utente del menu: sarà compresa tra i tag

<interface></interface>

;

menu_model ovvero l’oggetto menu genitore: sarà compreso tra i tag

<menu></menu>

;

sub_menu ovvero le voci dei menu: saranno comprese tra i tag

<submenu></submenu>

;

item ovvero gli elementi interni alle voci di menu: saranno compresi tra i tag

<item></item>

;

attribute ovvero l’attributo dell’istanza che verrà creata dal buider: sarà
compreso tra i tag

<attribute></attribute>

;

Nel nostro caso precedente il testo che rappresenta il menu della app, sarà:

<interface>
  <menu id='MenuModel'>
    <submenu>
      <attribute name='label'>File</attribute>
      <item>
        <attribute name='label'>New</attribute>
        <attribute name='action'>win.FileNew</attribute>
      </item>
      <item>
        <attribute name='label'>Quit</attribute>
        <attribute name='action'>win.FileQuit</attribute>
      </item>
    </submenu>
    <submenu>
      <attribute name='label'>About</attribute>
      <item>
        <attribute name='label'>Info</attribute>
        <attribute name='action'>win.AboutInfo</attribute>
      </item>
    </submenu>
  </menu>
</interface>

Basterà quindi creare il builder con il class_method Gtk.Builder.new_from_string(string, length):

>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk, Gio
>> UI_INFO = """
... <interface>
...
... </interface>
... """
>>> builder = Gtk.Builder.new_from_string(UI_INFO, -1)

Come anticipato, il builder istanzia gli oggetti descritti nella stringa e permette di recuperarli
con il metodo get_object(string):

>>> builder.get_object('MenuModel')
<Gio.Menu object at 0x0000000004cb7580 (GMenu at 0x000000000406f870)>
>>> menu_model = builder.get_object('MenuModel')
>>> menu_model.get_n_items()
2

Una volta creato il menu con il builder, il resto del codice non cambia:

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio


UI_INFO = """
<interface>
  <menu id='MenuModel'>
    <submenu>
      <attribute name='label'>File</attribute>
      <item>
        <attribute name='label'>New</attribute>
        <attribute name='action'>win.FileNew</attribute>
      </item>
      <item>
        <attribute name='label'>Quit</attribute>
        <attribute name='action'>win.FileQuit</attribute>
      </item>
    </submenu>
    <submenu>
      <attribute name='label'>About</attribute>
      <item>
        <attribute name='label'>Info</attribute>
        <attribute name='action'>win.AboutInfo</attribute>
      </item>
    </submenu>
  </menu>
</interface>
"""


class AppWindow(Gtk.ApplicationWindow):
    def __init__(self):
        super().__init__()
        self.set_default_size(200, 100)

        builder = Gtk.Builder.new_from_string(UI_INFO, -1)

        act_file = Gio.SimpleAction.new(name='FileNew', parameter_type=None)
        act_quit = Gio.SimpleAction.new(name='FileQuit', parameter_type=None)
        act_info = Gio.SimpleAction.new(name='AboutInfo', parameter_type=None)
        self.add_action(act_file)
        self.add_action(act_quit)
        self.add_action(act_info)

        menu_model = builder.get_object('MenuModel')
        menu_bar = Gtk.MenuBar.new_from_model(menu_model)

        # layout
        self.layout = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.layout.pack_start(menu_bar, False, False, 0)
        self.add(self.layout)

        act_file.connect('activate', self.on_menu)
        act_quit.connect('activate', self.on_quit)
        act_info.connect('activate', self.on_menu)
        self.connect('destroy', Gtk.main_quit)

    def on_menu(self, action, value):
        print("INFO: menu '%s'" % action.props.name)

    @staticmethod
    def on_quit(action, param):
        Gtk.main_quit()


if __name__ == '__main__':
    win = AppWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

Sottomenu di menu

Con lo stesso principio possiamo creare sottomenu di menu, ovvero elementi di menu, che a loro
volta contengono altri elementi sotto di essi.

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio


MENUBAR_INFO = """
<interface>
  <menu id='MenuModel'>
    <submenu>
      <attribute name='label'>File</attribute>
      <submenu>
        <attribute name="label">New</attribute>
          <section>
            <item>
              <attribute name="label">Text File</attribute>
              <attribute name="action">win.NewTextFile</attribute>
            </item>
            <item>
              <attribute name="label">Doc File</attribute>
              <attribute name="action">win.NewDocFile</attribute>
            </item>
            <item>
              <attribute name="label">Python File</attribute>
              <attribute name="action">win.NewPyFile</attribute>
            </item>
          </section>
      </submenu>
      <item>
        <attribute name='label'>Quit</attribute>
        <attribute name='action'>win.FileQuit</attribute>
      </item>
    </submenu>
    <submenu>
      <attribute name='label'>About</attribute>
      <item>
        <attribute name='label'>Info</attribute>
        <attribute name='action'>win.AboutInfo</attribute>
      </item>
    </submenu>
  </menu>
</interface>
"""


class AppWindow(Gtk.ApplicationWindow):
    def __init__(self):
        super().__init__()
        self.set_default_size(200, 100)

        builder = Gtk.Builder.new_from_string(MENUBAR_INFO, -1)

        act_text = Gio.SimpleAction.new(name='NewTextFile', parameter_type=None)
        act_doc = Gio.SimpleAction.new(name='NewDocFile', parameter_type=None)
        act_py = Gio.SimpleAction.new(name='NewPyFile', parameter_type=None)
        act_quit = Gio.SimpleAction.new(name='FileQuit', parameter_type=None)
        act_info = Gio.SimpleAction.new(name='AboutInfo', parameter_type=None)
        self.add_action(act_text)
        self.add_action(act_doc)
        self.add_action(act_py)
        self.add_action(act_quit)
        self.add_action(act_info)

        menu_model = builder.get_object('MenuModel')
        menu_bar = Gtk.MenuBar.new_from_model(menu_model)

        # layout
        self.layout = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.layout.pack_start(menu_bar, False, False, 0)
        self.add(self.layout)

        act_text.connect('activate', self.on_file)
        act_doc.connect('activate', self.on_file)
        act_py.connect('activate', self.on_file)
        act_quit.connect('activate', self.on_quit)
        act_info.connect('activate', self.on_menu)
        self.connect('destroy', Gtk.main_quit)

    def on_menu(self, action, value):
        print("INFO: menu '%s'" % action.props.name)

    def on_file(self, action, value):
        print("INFO: menu '%s'" % action.props.name)

    @staticmethod
    def on_quit(action, param):
        Gtk.main_quit()


if __name__ == '__main__':
    win = AppWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

Menu con RadioButton e ToggleButton

Nelle voci di menu possono essere contemplati anche elementi con stato, come ad esempio i
radiobutton e i togglebutton.

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib, Gio


MENUBAR_INFO = """
<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <menu id="menumodel">
    <submenu>
      <attribute name="label">Settings</attribute>
      <section>
        <item>
          <attribute name="label">millimeters</attribute>
          <attribute name="action">win.state</attribute>
          <attribute name="target">mm</attribute>
        </item>
        <item>
          <attribute name="label">inches</attribute>
          <attribute name="action">win.state</attribute>
          <attribute name="target">inches</attribute>
        </item>
      </section>
      <section>
        <item>
          <attribute name="label">Convert</attribute>
          <attribute name="action">win.convert</attribute>
        </item>
      </section>
    </submenu>
  </menu>
</interface>
"""


class AppWindow(Gtk.ApplicationWindow):
    def __init__(self):
        super().__init__(title="MenuBar Example")
        self.set_default_size(200, 200)

        act_state = Gio.SimpleAction.new_stateful(
            name="state", parameter_type=GLib.VariantType.new('s'),
            state=GLib.Variant.new_string('inches'))

        act_convert = Gio.SimpleAction.new_stateful(
            name="convert", parameter_type=None,
            state=GLib.Variant.new_boolean(False))
        self.add_action(act_state)
        self.add_action(act_convert)
        # bindings
        act_state.connect("activate", self.on_state)
        act_convert.connect("activate", self.on_convert)

        builder = Gtk.Builder.new_from_string(MENUBAR_INFO, -1)
        menu_model = builder.get_object('menumodel')
        menu_bar = Gtk.MenuBar.new_from_model(menu_model)
        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.pack_start(menu_bar, False, False, 0)
        self.add(box)

    def on_state(self, action, parameter):
        print("INFO: measure is set to '%s'" % parameter.get_string())
        action.set_state(parameter)

    def on_convert(self, action, parameter):
        action.set_state(GLib.Variant.new_boolean(not action.get_state()))
        result = "enabled" if action.get_state().get_boolean() else "disabled"
        print("INFO: <Convert> is %s" % result)


if __name__ == '__main__':
    win = AppWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

ToolBar

Con lo stesso principio si crea anche una ToolBar.
Una volta costruita la stringa XML la si dà in pasto al Gtk.Builder e si crea la toolbar:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio


TOOLBAR_INFO = """
<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkToolbar" id="toolbar">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="show_arrow">False</property>
    <child>
      <object class="GtkToolButton" id="new_button">
        <property name="use_action_appearance">False</property>
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="use_action_appearance">False</property>
        <property name="is_important">True</property>
        <property name="action_name">win.new</property>
        <property name="label" translatable="yes">New</property>
        <property name="use_underline">True</property>
        <property name="stock_id">gtk-new</property>
      </object>
      <packing>
        <property name="expand">False</property>
        <property name="homogeneous">True</property>
      </packing>
    </child>
    <child>
      <object class="GtkToolButton" id="open_button">
        <property name="use_action_appearance">False</property>
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="use_action_appearance">False</property>
        <property name="is_important">True</property>
        <property name="action_name">win.open</property>
        <property name="label" translatable="yes">Open</property>
        <property name="use_underline">True</property>
        <property name="stock_id">gtk-open</property>
      </object>
      <packing>
        <property name="expand">False</property>
        <property name="homogeneous">True</property>
      </packing>
    </child>
  </object>
</interface>
"""


class AppWindow(Gtk.ApplicationWindow):
    def __init__(self):
        super().__init__(title="Toolbar Example")
        self.set_default_size(250, 100)

        builder = Gtk.Builder.new_from_string(TOOLBAR_INFO, -1)

        act_new = Gio.SimpleAction.new(name='new', parameter_type=None)
        act_open = Gio.SimpleAction.new(name='open', parameter_type=None)
        self.add_action(act_new)
        self.add_action(act_open)

        tool_bar = builder.get_object('toolbar')
        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.pack_start(tool_bar, False, False, 0)
        self.add(box)

        # bindings
        act_new.connect('activate', self.on_menu)
        act_open.connect('activate', self.on_menu)
        self.connect('destroy', Gtk.main_quit)

    def on_menu(self, action, value):
        print("INFO: menu '%s'" % action.props.name)


if __name__ == '__main__':
    win = AppWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

Gtk.ApplicationWindow e Gtk.Application

Se invece di utilizzare solo un oggetto Gtk.ApplicationWindow, come negli esempi precedenti,
volessimo strutturare la nostra applicazione, utilizzando, sia una window Gtk.ApplicationWindow,
sia un oggetto Gtk.Application, avremmo la possibità di distinguere le actions, in base al loro
prefisso. Le actions inerenti la window dell’applicazione, come negli esempi precedenti, hanno
prefisso “win.” e vanno create, aggiunte alla lista delle actions e connesse, all’interno di
Gtk.ApplicationWindowe, mentre le altre vengono istanziate e connesse all’interno di
Gtk.Application e avranno prefisso “app.”.

Il codice subirà qualche variante, ad esempio il builder verrà creato dentro Gtk.Application.

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio
import sys


MENUBAR_INFO = """
<interface>
  <menu id='MenuModel'>
    <submenu>
      <attribute name='label'>File</attribute>
      <item>
        <attribute name='label'>New</attribute>
        <attribute name='action'>app.FileNew</attribute>
      </item>
      <item>
        <attribute name='label'>Quit</attribute>
        <attribute name='action'>app.FileQuit</attribute>
      </item>
    </submenu>
    <submenu>
      <attribute name='label'>About</attribute>
      <item>
        <attribute name='label'>Info</attribute>
        <attribute name='action'>win.AboutInfo</attribute>
      </item>
    </submenu>
  </menu>
</interface>
"""


class AppWindow(Gtk.ApplicationWindow):
    def __init__(self, title, app):
        super().__init__(title=title, application=app)
        self.set_default_size(200, 100)

        act_info = Gio.SimpleAction.new(name='AboutInfo', parameter_type=None)
        self.add_action(act_info)
        act_info.connect('activate', self.on_menu)
        self.connect('destroy', Gtk.main_quit)

    def on_menu(self, action, value):
        print("INFO: menu '%s'" % action.props.name)


class GApplication(Gtk.Application):
    def __init__(self):
        super().__init__()

    def do_activate(self):
        win = AppWindow(title="MenuBar Example", app=self)
        win.show_all()

    def do_startup(self):
        # PRIMA AZIONE DA FARE: invocare do_startup()
        Gtk.Application.do_startup(self)

        builder = Gtk.Builder.new_from_string(MENUBAR_INFO, -1)
        menu_model = builder.get_object('MenuModel')
        self.set_menubar(menu_model)
        act_file = Gio.SimpleAction.new(name='FileNew', parameter_type=None)
        act_quit = Gio.SimpleAction.new(name='FileQuit', parameter_type=None)
        self.add_action(act_file)
        self.add_action(act_quit)
        act_file.connect('activate', self.on_new)
        act_quit.connect('activate', self.on_quit)

    def on_new(self, action, value):
        print("INFO: menu '%s'" % action.props.name)

    def on_quit(self, action, parameter):
        sys.exit()


if __name__ == '__main__':
    app = GApplication()
    exit_status = app.run(sys.argv)
    sys.exit(exit_status)

Accelerator and mnemonic

Le Labels possono contenere mnemonics. Gli Mnemonics sono gli underscores nella
label prima del carattere che vogliamo utilizzare come scorciatoia da tastiera.
Ad esempio “_File”, ci indica che la “F” sarà il carattere mnemonic del menu File.
Premendo ALT, gli mnemonic diventeranno visibili. Premendo Alt+F il menu File, si aprirà.
Gli Accelerators possono essere aggiunti esplicitamente nella stringa XML che
definisce la UI. Per fare questo basta aggiungere un attributo “accel” all’item.
Nota:

&lt;Primary&gt;q

creerà la sequenza Ctrl+Q, dove “Primary” si riferisce al tasto Ctrl.

l’XML dell’item diventerà quindi:

      <item>
        <attribute name='label'>_Quit</attribute>
        <attribute name='action'>app.FileQuit</attribute>
        <attribute name="accel">&lt;Primary&gt;q</attribute>
      </item>

link di riferimento:

torna all’indice degli appunti
Gtk3 MenuBar

Categorie:Gtk3, PyGObject, python Tag: , ,

PyGObject: Gtk.ListStore

13 Aprile 2020 Commenti chiusi

torna all’indice degli appunti

ListStore

Il widget Gtk.ListStore fa parte del pattern model-view di GTK3.
E’ di fatto un model molto semplice, poichè consente di gestire solo un livello di righe di dati,
senza cioè le child-rows.
Per gestire dati annidati, si passa quindi al model “cugino” Gtk.TreeStore.
Entrambi i model sono potenti e flessibili e insieme alla view permettono di avere le seguenti funzionalità:

– aggiornamento automatico dei dati quando questi vengono aggiunti, rimossi o modificati
– supporto al Drag and drop
– ordinamento dei dati
– incorporamento di widgets come checkboxes, progressbars, ecc.
– colonne riordinabili e ridimensionabili
– filtraggio dati

Model

Come accennato, ogni Gtk.TreeView ha un Gtk.TreeModel associato che contiene i
dati visualizzati dal widget treeview.
Un Gtk.TreeModel può essere utilizzato da più di un TreeView contemporaneamente.
Teoricamente è possibile implementare il proprio Model, ma vedremo nel dettaglio il Gtk.ListStore.

Quando costruiamo il model, dobbiamo specificare che tipo di dati ogni colonna del model gestirà.
Il costruttore è pertanto Gtk.ListStore(*column_types)

>>> store = Gtk.ListStore(str, str, float)

Questo crea un liststore con 3 colonne, 2 che conterranno un tipo str e 1 float.
Per aggiungere i dati al liststore, si utilizza il metodo append(iterable).
Iterable è la lista con i valori da inserire nella row, che devono rispettare il type definito precedentemente.

Il metodo append() ritorna un oggetto Gtk.TreeIter che punta alla posizione della
row appena inserita.

>>> treeiter = store.append(["HANDANOVIC", "portiere", 1])

Una volta che i dati sono stati inseriti, è possibile recuperarli con lo stesso treeiter…

>>> store[treeiter][0]
'HANDANOVIC'

o modificarli direttamente:

>>> store[treeiter][0] = "HANDANOVIC Samir"
>>> store[treeiter][0]
'HANDANOVIC Samir'

Per conoscere il numero di rows si utilizza il metodo len():

>>> len(store)
1

ed è possibile iterare con for direttamente sull’oggetto ListStore:

>>> for row in store:
...     print(row[:])
...     
['HANDANOVIC Samir', 'portiere', 1]

Path

Oltre ad accedere ai dati dello store come si fa con le liste, è possibile farlo anche con
Gtk.TreePath. Questo treepath è un riferimento ad una certa row nel tree model e
grazie al metodo get_iter() è possibile ottenere l’iterator desiderato.

>>> row1 = Gtk.TreePath(0)
>>> treeiter = store.get_iter(row1)
>>> store.get_value(treeiter, 1)
'portiere'

Metodi

Vediamo quali sono i metodi utilizzabili con Gtk.ListStore:

new(types)

Metodo costruttore che crea una nuova istanza di Gtk.ListStore.
Parametri:
types: una lista di tipi rappresentanti il tipo di dato che le colonne ospiteranno.

append(row=None)

Aggiunge una row di dati al liststore e ritorna l’oggetto Gtk.TreeIter che si
riferisce alla row aggiunta.
Parametri:
row: è la lista di valori da assegnare alla row appena aggiunta.
Se row è None, verrà aggiunta una row vuota e per inserire i dati in essa,
sarà necessario utilizzare i metodi Gtk.ListStore.set() o Gtk.ListStore.set_value().

clear()

Rimuove tutte le rows dal liststore.

insert(position, row=None)

Inserisce una row alla posizione desiderata e ritorna l’oggetto Gtk.TreeIter che si riferisce alla
row aggiunta.
Parametri:
position: la posizione (int) dove inseriremo la row.
Se position=-1 o maggiore del numero di rows del liststore, verrà inserita in fondo (append);
row: è la lista di valori da assegnare alla row appena aggiunta.
Se row è None, verrà aggiunta una row vuota e per inserire i dati in essa,
sarà necessario utilizzare i metodi Gtk.ListStore.set() o Gtk.ListStore.set_value().

insert_after(sibling, row=None)

Inserisce la row dopo il riferimento specificato e ritorna l’oggetto Gtk.TreeIter che si riferisce
alla row aggiunta.
Parametri:
sibling: un oggetto Gtk.TreeIter valido, ovvero
il riferimento alla row, dopo la quale vogliamo inserire la nuova row, o None.
row: è la lista di valori da assegnare alla row appena aggiunta.
Se row è None, verrà aggiunta una row vuota e per inserire i dati in essa,
sarà necessario utilizzare i metodi Gtk.ListStore.set() o Gtk.ListStore.set_value().

insert_before(sibling, row=None)

Inserisce la row prima del riferimento specificato e ritorna l’oggetto Gtk.TreeIter che si
riferisce alla row aggiunta.
Parametri:
sibling: un oggetto Gtk.TreeIter valido, ovvero
il riferimento alla row, prima della quale vogliamo inserire la nuova row, o None.
row: è la lista di valori da assegnare alla row appena aggiunta.
Se row è None, verrà aggiunta una row vuota e per inserire i dati in essa,
sarà necessario utilizzare i metodi Gtk.ListStore.set() o Gtk.ListStore.set_value().

insert_with_valuesv(position, columns, values)

Inserisce i dati, nelle colonne specificate, nella row di posizione desiderata e ritorna l’oggetto
Gtk.TreeIter che si riferisce alla row aggiunta.
Parametri:
position: la posizione (int) dove inseriremo la row.
Se position=-1 o maggiore del numero di rows del liststore, verrà inserita in fondo (append);
columns: una lista con gli indici (int) delle colonne dove vogliamo
inserire i valori;
values: un lista di oggetti GObject.Value

iter_is_valid(iter)

Funzione da utilizzare in fase di debug, causa la lentezza; ritorna True se iter è valido.
Parametri:
iter: un oggetto Gtk.TreeIter;

move_after(iter, position)

Muove l’iter dopo la posizione specificata. Questa funzione si utilizza solo con treestore non ordinati.
Parametri:
iter: l’oggetto Gtk.TreeIter da spostare;
position: l’oggetto Gtk.TreeIter dopo il quale spostare “iter”.
Se position=None, l’iter sarà spostato all’inizio del liststore.

move_before(iter, position)

Muove l’iter prima della posizione specificata. Questa funzione si utilizza solo con treestore non ordinati.
Parametri:
iter: l’oggetto Gtk.TreeIter da spostare;
position: l’oggetto Gtk.TreeIter prima del quale spostare “iter”.
Se position=None, l’iter sarà spostato alla fine del liststore.

prepend(row=None)

Inserisce i valori in una row anteposta e ritorna l’oggetto Gtk.TreeIter che si riferisce alla row anteposta.
Parametri:
row: è la lista di valori da assegnare alla row appena aggiunta.
Se row è None, verrà aggiunta una row vuota e per inserire i dati in essa,
sarà necessario utilizzare i metodi Gtk.ListStore.set() o Gtk.ListStore.set_value().

remove(iter)

Rimuove la row con riferimento “iter” dal liststore e ritorna True se l’iter è valido, altrimenti False ad operazione fallita.
Se l’operazione ha buon fine, iter diventerà la row valida successiva, oppure sarà invalidato se dovesse puntare all’ultima row del liststore.
Parametri:
iter: l’oggetto Gtk.TreeIter da rimuovere;

reorder(new_order)

Riordina il liststore secondo l’iterable new_order.
Questa funzione si utilizza solo con treestore non ordinati.
Parametri:
new_order: una lista di interi che mappa la nuova posizione delle rows.
Il numero di elementi deve essere lo stesso delle rows presenti nel liststore.

set(iter, columns, values)

Setta i valori nelle colonne indicate, per la row con iter “iter”.
Parametri:
iter: l’oggetto Gtk.TreeIter indicante la row da modificare;
columns: una lista di indici relativi alle colonne interessate dalla modifiche;
values: un lista di oggetti GObject.Value, ovvero i valori da inserire
nelle rispettive colonne;

set_column_types(types)

Funzione da utilizzare solo quando si costruisce un nuovo Gtk.ListStore.
Non funziona dopo che una row è stata aggiunta o quando si utilizzano i metodi dell’interfaccia
di Gtk.TreeModel.

set_value(iter, column, value)

Setta i dati nella cella specificata da iter e column. Il valore “value” deve essere convertibile
nel tipo di dato previsto dalla colonna. Il valore può essere Python value, inquanto sarà
convertito in un oggetto GObject.Value.
Parametri:
iter: l’oggetto Gtk.TreeIter indicante la row da modificare;
column: il numero (int) di colonna nel quale inserire il valore;
value: l’oggetto GObject.Value da inserire nella
cella definita da iter-column.

swap(a, b)

Inverte di posizione le row “a” e “b”.
Parametri:
a: il Gtk.TreeIter indicante la prima row da scambiare con la seconda;
b: il Gtk.TreeIter indicante la seconda row da scambiare con la prima;

View

La view è unica sia per un model liststore che per un model treestore.
Settare un Gtk.TreeView è semplicissimo, dobbiamo solo fornirgli l’oggetto
Gtk.TreeModel dal quale attingere i dati, o passandolo il fase di costruzione,
come argomento, o utilizzando successivamente il metodo Gtk.TreeView.set_model().

>>> treeview = Gtk.TreeView(model=store)

Una volta che il treeview possiede un model, deve sapere come visualizzare i dati.
Qui entrano in gioco i column-renderers ed i cell-renderers.
I CellRenderers
sono usati per disegnare i dati del model nella view. GTK+ mette a disposizione cell-renderers
specifici, come Gtk.CellRendererText, Gtk.CellRendererPixbuf e Gtk.CellRendererToggle, ma è
possibile codificare un renderer personalizzato.

Il Gtk.TreeViewColumn è l’oggetto che Gtk.TreeView usa per organizzare le colonne.
Ha bisogno di conoscere le label per la colonna, che tipo di cell-renderer utilizzare e quale dato
ottenere dal model per una data row.

>>> treeview = Gtk.TreeView(model=store)
>>> renderer = Gtk.CellRendererText()
>>> column = Gtk.TreeViewColumn("Giocatore", renderer, text=0)
>>> treeview.append_column(column)
1

Per fare il render di più di un model in una colonna della view, dobbiamo creare l’istanza
Gtk.TreeViewColumn e usare il metodo Gtk.TreeViewColumn.pack_start().

>>> column = Gtk.TreeViewColumn("Giocatore e ruolo")
>>> r_nome = Gtk.CellRendererText()
>>> r_ruolo = Gtk.CellRendererText()
>>> column.pack_start(r_nome, True)
>>> column.pack_start(r_ruolo, True)
>>> column.add_attribute(r_nome, "text", 0)
>>> column.add_attribute(r_ruolo, "text", 1)
>>> treeview.append_column(column)

Selection

In questo tipo di widget molto probabilmente verranno effettuate delle selezioni.
Per poter accedere al contenuto della selezione, dobbiamo connettere il segnale “changed”
all’oggetto Gtk.TreeSelection.
Quindi dobbiamo recuperare un reference della selezione con il metodo get_selection():

>>> select = treeview.get_selection()
>>> def on_tree_selection_changed(selection):
...     model, treeiter = selection.get_selected()
...     if treeiter is not None:
...         print("You selected", model[treeiter][0])
...         
>>> select.connect("changed", on_tree_selection_changed)

E’ possibile controllare quali selezioni sono permesse chiamando il metodo Gtk.TreeSelection.set_mode().
Gtk.TreeSelection.get_selected() non funziona se il selection-mode è settato
a Gtk.SelectionMode.MULTIPLE, use invece Gtk.TreeSelection.get_selected_rows().

Sorting

il Sorting (ordinamento) è una delle caratteristiche più importanti del treeview
ed è supportata dai treemodels standard (Gtk.TreeStore and Gtk.ListStore), che implementano
l’interfaccia Gtk.TreeSortable.

Sorting da colonna

Una colonna di un Gtk.TreeView può essere resa sortable semplicemente chiamando
il metodo Gtk.TreeViewColumn.set_sort_column_id().
In questo modo la colonna potrà essere ordinata semplicemente cliccando sulla sua intestazione.

>>> store.append(["GODIN Diego", "defender", 2])
>>> store.append(["DE VRIJ Stefan", "defender", 6])
>>> store.append(["LUKAKU Romelu", "forward", 9])

abbiamo semplicemente aggiunto delle rows allo store precedentemente creato.
il TreeView è già esistente ed automaticamente aggiornato:

>>> len(treeview.get_model())
4
>>> column.set_sort_column_id(0)

Se invece volessimo utilizzare una funzione di sorting personalizzata, dovremmo settarla con il
metodo set_sort_func().
Per prima cosa va definita la funzione di sorting che deve prendere 2 rows e confrontarle,
se la prima deve stare prima della seconda, la funzione ritorna -1, 0 se sono uguali in posizione
e 1 se la seconda row deve stare prima:

def compare(model, row1, row2, user_data):
    sort_column, _ = model.get_sort_column_id()
    value1 = model.get_value(row1, sort_column)
    value2 = model.get_value(row2, sort_column)
    if value1 < value2:
        return -1
    elif value1 == value2:
        return 0
    else:
        return 1

Poi la settiamo con il metodo set_sort_func().

>>> store.set_sort_func(0, compare, None)

Filtering

Diversamente dal sorting, il filtering non è gestito dai models, ma dalla classe
Gtk.TreeModelFilter.
Questa classe, come i Gtk.TreeStore e Gtk.ListStore, è una Gtk.TreeModel.
Agisce come una “velina” davanti al model reale (Gtk.TreeStore o Gtk.ListStore), nascondendo
alcuni elementi alla view. In pratica fornisce il Gtk.TreeView con un set of the model sottostanti.
Si possono creare istanze di Gtk.TreeModelFilter, una sull’altra, in modo da utilizzare filtri
multipli sullo stesso model E’ possibile creare una nuova istanza di Gtk.TreeModelFilter e darle
un model da filtrare, ma il modo più semplice è usare direttamente il metodo Gtk.TreeModel.filter_new().

>>> filter = store.filter_new()

Nello stesso modo in cui lavora la funzione di sorting, il Gtk.TreeModelFilter necessita di una
funzione “visibility”, la quale, data una row dal modello sottostante, ritornerà un boolean
indicante se questa row deve essere filtrata o meno.
Questa funzione viene settata con il metodo Gtk.TreeModelFilter.set_visible_func():

>>> filter.set_visible_func(filter_func, data=None)

Ecco un codice di esempio:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Pango


player_list = [("HANDANOVIC Samir", "goalkeeper",  1),
               ("PADELLI Daniele", "Portiere", 27),
               ("BERNI Tommaso", "Portiere", 46),
               ("GODIN Diego", "Difensore Centrale", 2),
               ("DE VRIJ Stefan", "Difensore Centrale", 6),
               ("RANOCCHIA Andrea", "Difensore Centrale", 13),
               ("ASAMOAH Keadwo", "Difensore", 18),
               ("DIMARCO Federico", "Difensore", 21),
               ("D'AMBROSIO Danilo", "Difensore", 33),
               ("BIRAGHI Cristiano", "Difensore", 34),
               ("SKRINIAR Milan", "Difensore Centrale", 37),
               ("BASTONI Alessandro", "Difensore Centrale", 95),
               ("GAGLIARDINI Roberto", "Centrocampista Centrale", 5),
               ("VECINO Matias", "Centrocampista Centrale", 8),
               ("SENSI Stefano", "Centrocampista Centrale", 12),
               ("LAZARO Valentino", "Ala", 19),
               ("BORJA Valero", "Centrocampista Centrale", 20),
               ("BARELLA Nicolò", "Centrocampista Centrale", 23),
               ("BROZOVIC Marcelo", "Centrocampista Centrale", 77),
               ("CANDREVA Antonio", "Ala", 87),
               ("SANCHEZ Alexis", "Seconda Punta", 7),
               ("LUKAKU Romelu", "Punta", 9),
               ("MARTINEZ Lautaro", "Punta", 10),
               ("ESPOSITO Sebastiano", "Punta", 30),]


class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Treeview with model ListStore example")
        self.set_border_width(10)

        self.current_filter_role = None

        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
        self.add(hbox)

        # Creo il ListStore model
        self.player_liststore = Gtk.ListStore(str, str, int)
        for player in player_list:
            self.player_liststore.append(list(player))

        # Creo il model filter associandolo al liststore model
        self.role_filter = self.player_liststore.filter_new()
        # setto la funzione di filter
        self.role_filter.set_visible_func(self.role_filter_func)

        # creo il treeview ed uso il filter come model
        self.treeview = Gtk.TreeView.new_with_model(
            Gtk.TreeModelSort(model=self.role_filter))
        # creo le colonne
        for i, column_title in enumerate(["Nome", "Ruolo", "Numero"]):
            renderer = Gtk.CellRendererText()
            if i == 0:
                renderer.props.weight_set = True
                renderer.props.weight = Pango.Weight.BOLD
            column = Gtk.TreeViewColumn(column_title, renderer, text=i)
            column.set_sort_column_id(i)
            self.treeview.append_column(column)

        # creo i Buttons per attivare il filter
        for role in ["Portiere", "Difensore", "Difensore Centrale",
                     "Centrocampista Centrale", "Ala",
                     "Punta", "Seconda Punta", "Tutti"]:
            button = Gtk.Button(label=role)
            vbox.pack_start(button, True, True, 0)
            button.connect("clicked", self.on_selection_button_clicked)

        self.treeview.connect("row-activated", self.on_select_row)
        hbox.pack_start(self.treeview, True, True, 0)
        hbox.pack_start(vbox, True, True, 0)

    def role_filter_func(self, model, iter, data):
        """Tests if the language in the row is the one in the filter"""
        if self.current_filter_role is None or \
                self.current_filter_role == "Tutti":
            return True
        else:
            # il ruolo è il secondo dato della row
            return model[iter][1] == self.current_filter_role

    def on_selection_button_clicked(self, widget):
        self.current_filter_role = widget.get_label()
        print("INFO: '%s' role selected!" % self.current_filter_role)
        self.role_filter.refilter()

    @ staticmethod
    def on_select_row(tree_view, path, column):
        print("INFO: '%s' selected!" % tree_view.get_model()[path][0])


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 ListStore

Categorie:Gtk3, PyGObject, python Tag: , ,

PyGObject: Gtk.ListBox

13 Aprile 2020 Commenti chiusi

torna all’indice degli appunti

ListBox

Il widget Gtk.ListBox è un widget che contiene dei widget-figlio di tipo Gtk.ListBoxRow;
viene utilizzata quando vogliamo listare widget diversi tra loro, label, checkbutton ecc.
Queste rows (figli) possono essere anche ordinate e filtrate dinamicamente.

Per creare una ListBox si utilizza il costruttore Gtk.ListBox(**kwargs).
Come per tutti gli altri widgets visti fino ad ora, è possibile settare i parametri del widget
anche successivamente alla sua costruzione, con i soliti metodi getter e
setter get_property(property_name) e set_property(property_name, property_value):
La property più significativa è selection-mode, cioè un enum di tipo Gtk.SelectionMode
che può assumere i seguenti valori:

NONE (0): nessuna selezione possibile;
SINGLE (1): può essere selezionato 1 solo elemento, o nessuno;
BROWSE (2): può essere selezionato 1 solo elemento, ma è possibile anche deselezionarlo;
MULTIPLE (3): è possibile selezionare elementi multipli;

 
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk
>>> listbox = Gtk.ListBox()
>>> listbox.set_property("selection-mode", Gtk.SelectionMode.NONE)
>>> listbox.get_property("selection-mode")
<enum GTK_SELECTION_NONE of type Gtk.SelectionMode>

oppure con i metodi getter e setter specifici get_*property_name*() e
set_*property_name*(value).

Le properties principali di Gtk.ListBox sono:

Name Type Flags Short Description
activate-on-single-click bool r/w/en Attiva la row con singolo click
selection-mode Gtk.SelectionMode r/w/en Il tipo di selection mode

Segnali

I segnali principali sono:

Name Short Description
row-activated il segnale “row-activated” viene emesso quando una row viene attivata
row-selected il segnale “row-selected” viene emesso quando una nuova row viene selezionata, deselezionata
select-all il segnale “select-all” viene emesso quando tutti i children della listbox vengono selezionati (selection-mode = MULTIPLE)
selected-rows-changed il segnale “selected-rows-changed” viene emesso quando la selezione multipla cambia
unselect-all il segnale “unselect-all” viene emesso quando vengono deselezionati tutti i children della listbox, (selection-mode = MULTIPLE)

Metodi

Di seguito i metodi utilizzabili con il widget Gtk.ListBox:

new()

Metodo costruttore che crea un nuovo contenitore di tipo Gtk.ListBox

bind_model(model, create_widget_func, *user_data)

Lega la listbox a model, dove model è un oggetto di tipo Gio.ListModel.
Il precedente legame viene distrutto ed il contenuto della listbox, cancellato e nuovamente
riempito con gli elementi di model. Ogni volta che model cambia, la listbox viene aggiornata.
Se model=None, la listbox rimane vuota.
Utilizzare un model, è incompatibile con le funzionalità di filtering e sorting della listbox.
Tali funzionalità però possono essere implementate all’interno del model.
Parametri:
model: l’oggetto Gio.ListModel a cui legare la listbox, o None;
create_widget_func: una funzione che crei i widgets da utilizzare
come elementi, o None in caso model=None;
user_data: i dati da passare alla funzione create_widget_func;

drag_highlight_row(row)

Una funzione per implementare il Drag and Drop su una Gtk.ListBox.
La row passata come argomento verrà evidenziata con il metodo Gtk.Widget.drag_highlight() e
ogni row precedentemente evidenziata, tornerà nel suo stato “normale”.
Parametri:
row: un oggetto Gtk.ListBoxRow;

drag_unhighlight_row()

Se una row è stata precedentemente evidenziata via Gtk.ListBox.drag_highlight_row(),
tornerà al suo stato normale;

get_activate_on_single_click()

Ritorna True se la row viene attivata con un singolo click, altrimenti False.

get_adjustment()

Ritorna l’adjustment (se presente) che il widget usa con lo scrolling verticale.

get_row_at_index(index_)

Ritorna il child widget alla row index_, esclusa l’intestazione della listbox.
Se index_ è negatico o maggiore del numero di elementi della listbox, verrà ritornato None.
Parametri:
index_: l’indice (int) della row;

get_row_at_y(y)

Ritorna la row in posizione y.
Parametri:
y: la posizione (int) della row;

get_selected_row()

Ritorna la row selezionata.
In caso di selezione multipla, utilizzare il metodo selected_foreach() per
avere tutte le row selezionate

get_selected_rows()

Ritorna un oggetto di tipo GLib.List contenente tutti i children selezionati.
Una volta utilizzato l’oggetto, liberarlo con il metodo g_list_free().

get_selection_mode()

Ritorna il valore della property selection-mode.

insert(child, position)

Inserisce un child di tipo Gtk.Widget, alla posizione position.
Se si usa una funzione di sort, il child sarà inserito automaticamente alla giusta posizione.
Se position=-1 o è maggiore del numero di elementi nella listbox, il child sarà aggiunto alla fine (append).
Parametri:
child: l’oggetto Gtk.Widget da aggiungere alla listbox;
position: la posizione dove inserire il child;

invalidate_filter()

Aggiorna il filtering per tutte le rows. Questo metodo è utile quando il
risultato della funzione di filter è cambiato a causa di fattori esterni, ad esempio cambia il
contenuto della entry appena terminata la funzione di filter sul contenuto precedente della stessa.

invalidate_headers()

Aggiorna i separators per tutte le rows. Da utilizzare quando il risultato
della funzione di header è cambiato a causa di un fattore esterno.

invalidate_sort()

Aggiorna il sorting per tutte le rows.
Da utilizzare quando il risultato della funzione di sort è cambiato a causa di un fattore esterno.

prepend(child)

Aggiunge in capo alla listbox il child di tipo Gtk.Widget.
Se è stata settata una funzione di sort, il widget verrà automaticamente inserito nella posizione
corretta.
Parametri:
child: l’oggetto Gtk.Widget da aggiungere alla listbox;

select_all()

Seleziona tutti gli elementi della listbox.

select_row(row)

Seleziona il widget row.
Parametri:
row: l’oggetto Gtk.ListBoxRow da selezionare, o None

selected_foreach(func, *data)

Chiama la funzione func per ogni child selezionato.
All’interno di questa funzione non è possibile modificare la selezione.
Parametri:
func: un oggetto Gtk.ListBoxForeachFunc), ovvero
la funzione da chiamare per ogni child selezionato;
data: i parametri da passare alla funzione func;

set_activate_on_single_click(single)

Se single = True le rows saranno attivate con un singolo click, altrimenti sarà
necessario il double-click.

set_adjustment(adjustment)

Setta l’adjustment che il widget userà durante lo scrolling verticale.
Normalmente quando la listbox è inserita in un contenitore di tipo Gtk.ScrolledWindow,
l’adjustment sarà gestito automaticamente, pertanto non occorre gestirlo manualmente con questo
metodo.

set_filter_func(filter_func, *user_data)

Setta una funzione di filter per decidere quali elementi visualizzare nella listbox.
La funzione sarà chiamata per ogni row e continuerà ad essere invocata ogni volta che una row
cambia, grazie al metodo changed() dell’oggetto Gtk.ListBoxRow
(i children della listbox), o quando viene invocato il metodo invalidate_filter()
sulla listbox.
Nota: l’utilizzo di una funzione di filter è incompatibile con l’utilizzo di un model.
Parametri:
filter_func: l’oggetto Gtk.ListBoxFilterFunc, ovvero la callback
che permette di filtrare le rows o None;
user_data: i parametri da passare alla funzione filter_func;

set_header_func(update_header, *user_data)

Settando un funzione di header sulla listbox, possiamo dinamicamente aggiungere gli headers
alle rows, in base al loro contenuto e alla loro posizione. Ad esempio in una listbox ordinata
per tipo, possiamo aggiungere l’header di fronte alla row, ogni volta che si presenta un nuovo tipo.
update_header può controllare l’header widget corrente con il metodo
Gtk.ListBoxRow.get_header() ed eventualmente, sia aggiornare lo stato del widget,
sia settare un nuovo header con il metodo Gtk.ListBoxRow.set_header().
La funzione update_header sarà chiamata per ogni row e continuerà ad essere
invocata ogni volta che un row cambia, grazie al metodo Gtk.ListBoxRow.changed(),
quando la row precedente cambia o quando la row precedente diventa un row differente.
Viene infine chiamata quandi viene invocato il metodo Gtk.ListBox.invalidate_headers.
Parametri:
update_header: l’oggetto Gtk.ListBoxUpdateHeaderFunc, ovvero
la callback che permette di aggiungere gli headers, o None;
user_data: i parametri da passare alla funzione update_header;

set_placeholder(placeholder)

Setta il widget placeholder che viene visualizzato nella lista, quando nessun
children risulta visibile.

set_selection_mode(mode)

Setta la property selection-mode a mode.
Parametri:
mode: un oggetto Gtk.SelectionMode;

set_sort_func(sort_func, *user_data)

Settando una funzione di sort, possiamo dinamicamente riordinare le rows.
La funzione sort_func sarà chiamata per ogni row e continuerà ad essere invocata
ogni volta che la row cambia, grazie al metodo Gtk.ListBoxRow.changed(), o quando
viene chiamato il metodo Gtk.ListBox.invalidate_sort().
Nota: l’uso di una funzione di sort non è compatibile con l’utilizzo di un model.
Parametri:
sort_func: l’oggetto Gtk.ListBoxSortFunc,
ovvero la funzione di sort, oppure None;
user_data: i parametri da passare a sort_func;
L’oggetto Gtk.ListBoxSortFunc si aspetta in ingresso i seguenti parametri:
row1: la prima row (Gtk.ListBoxRow);
row2: la seconda row (Gtk.ListBoxRow);
user_data: un oggetto o None
Ritorna un numero < 0 se row1 deve stare prima di row2, un numero=0, se sono uguali e un numero > 0 se row1 deve stare dopo row2.

unselect_all()

Deseleziona tutti i children della listbox, se il selection-mode lo permette (MULTIPLE).

unselect_row(row)

Deseleziona la singola row, se il selection mode lo permette.
Parametri:
row: l’oggetto Gtk.ListBoxRow che vogliamo deselezionare

Di seguito un codice d’esempio:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject


class ListBoxRowWithData(Gtk.ListBoxRow):
    def __init__(self, name, role):
        super(Gtk.ListBoxRow, self).__init__()
        self.name = name
        self.role = role
        label_name = Gtk.Label(label=self.name, xalign=0)
        label_role = Gtk.Label(label=self.role, xalign=1)
        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
        hbox.pack_start(label_name, True, True, 0)
        hbox.pack_start(label_role, True, True, 0)
        self.add(hbox)


class NamedSwitch(Gtk.Switch):
    __gproperties__ = {"name": (str,  # type
                                "switch name",  # nick
                                "the setting the switch enables",  # desc
                                "",  # default
                                GObject.ParamFlags.READWRITE, ),
                       }

    def __init__(self):
        super().__init__()

    def do_get_property(self, prop):
        print("INFO: getting property '%s'" % prop)
        return self.name

    def do_set_property(self, prop, value):
        print("INFO: setting property '%s' to %s" % (prop, value))
        self.name = value


class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="ListBox Demo")
        self.set_border_width(10)

        box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(box_outer)

        listbox = Gtk.ListBox()
        listbox.set_selection_mode(Gtk.SelectionMode.NONE)
        box_outer.pack_start(listbox, True, True, 0)
        # build first row
        row1 = Gtk.ListBoxRow()
        hbox1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
        mod_label = "Modificatore Difesa"
        label = Gtk.Label(label=mod_label, xalign=0)
        hbox1.pack_start(label, True, True, 0)
        switch1 = NamedSwitch()
        switch1.set_property("name", mod_label)
        switch1.props.valign = Gtk.Align.CENTER
        hbox1.pack_start(switch1, False, True, 0)
        row1.add(hbox1)
        listbox.add(row1)
        # build second row
        row2 = Gtk.ListBoxRow()
        hbox2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
        trq_label = "Utilizzo Trequartista"
        label2 = Gtk.Label(label=trq_label, xalign=0)
        hbox2.pack_start(label2, True, True, 0)
        switch2 = NamedSwitch()
        switch2.set_property("name", trq_label)
        switch2.props.valign = Gtk.Align.CENTER
        hbox2.pack_start(switch2, False, True, 0)
        row2.add(hbox2)
        listbox.add(row2)
        # build third row
        row3 = Gtk.ListBoxRow()
        hbox3 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
        row3.add(hbox3)
        label = Gtk.Label(label="Modulo", xalign=0)
        combo = Gtk.ComboBoxText()
        for index, mod in enumerate(["343", "352", "442", "433"]):
            combo.insert(index, "%s" % index, mod)
        hbox3.pack_start(label, True, True, 0)
        hbox3.pack_start(combo, False, True, 0)
        listbox.add(row3)

        listbox2 = Gtk.ListBox()
        names = [('HANDANOVIC', 'Goalkeeper'), ('SKRINIAR', 'Defender'),
                   ('GODIN', 'Defender'), ('DE VRIJ', 'Defender'), ]
        for name, role in names:
            initial_role = ""
            item = ListBoxRowWithData(name, role)
            if role != initial_role:
                item.set_header(Gtk.Label(label="role"))
            listbox2.add(item)

        box_outer.pack_start(listbox2, True, True, 0)
        listbox2.show_all()

        # sorting
        listbox2.set_sort_func(self.sort_func)
        # binding
        listbox2.connect('row-activated', self.on_row_activated)
        switch1.connect("notify::active", self.on_switch_activated)
        switch2.connect("notify::active", self.on_switch_activated)

    @staticmethod
    def on_row_activated(listbox_widget, row):
        print("INFO: %s selezionato" % row.name)

    @staticmethod
    def sort_func(row_1, row_2, data=None):
        return row_1.name.lower() > row_2.name.lower()

    @staticmethod
    def on_switch_activated(switch, gparam):
        if switch.get_active():
            state = "ON"
        else:
            state = "OFF"
        print("INFO: '%s' %s" % (switch.get_property("name"), state))


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 ListBox

Categorie:Gtk3, PyGObject, python Tag: , ,

PyGObject: Gtk.LinkButton

13 Aprile 2020 Commenti chiusi

torna all’indice appunti

LinkButton

Il Gtk.LinkButton è un Gtk.Button con un hyperlink, che innesca un azione quando viene cliccato.
Un link button viene creato sia con il class-method Gtk.LinkButton.new(), sia con Gtk.LinkButton.new_with_label(),
dove la URI passata al costruttore verrà utilizzata come label del widget.
La URI legata al Gtk.LinkButton può essere settata con il metodo Gtk.LinkButton.set_uri(), e recuperata con il metodo
Gtk.LinkButton.get_uri().
Di default Gtk.LinkButton chiama Gtk.show_uri_on_window() quando viene cliccato.

Le properties principali sono:

Name Type Flags Short Description
uri str r/w La URI legata al button
visited bool r/w/en Se questo link è stato visitato

Segnali

Il segnale relativo al linkbutton è:

Name Short Description
activate-link Il segnale “::activate-link” viene emesso ogni volta che il Gtk.LinkButton viene cliccato

Metodi

Oltre ai soliti getter e setter relativi alle properties dell’oggetto Gtk.LinkButton, i principali metodi sono:

new(uri)

Crea un nuovo Gtk.LinkButton con la URI passata come argomento.
Parametri:
uri: una URI valida;

new_with_label(uri, label)

Crea un nuovo Gtk.LinkButton con la URI passata come argomento e una label per il button.
Parametri:
uri: una URI valida;
label: il testo del button;

get_uri()

Ritorna la URI settata con il metodo Gtk.LinkButton.set_uri().

get_visited()

Ritorna lo stato “visited” della URI alla quale punta il button. Il Button diventa “visitato” quando viene cliccato, quindi il metodo
ritorna True. Se la URI del button cambia, lo stato della URI passa da “visited” ad “unvisited” e in questo caso il metodo
ritorna False. Lo stato cambia anche invocando il metodo Gtk.LinkButton.set_visited().

set_uri(uri)

Setta la URI alla quale il Gtk.LinkButton punterà. Come effetto collaterale questo porterà a False, lo stato “visited” della URI.
Parametri:
uri: una URI valida;

set_visited(visited)

Setta a True lo stato “visited” della URI alla quale punta il Gtk.LinkButton.
Parametri:
visited: il boolean che setta lo stato “visited” della URI;

Di seguito un codice di esempio:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk


class GButton(Gtk.Window):

    def __init__(self):
        super().__init__(title="LinkButton Example")
        self.set_border_width(10)
        linkbutton = Gtk.LinkButton.new_with_label(
            uri="http://www.google.it", label="Google")
        self.add(linkbutton)

        linkbutton.connect("activate-link", self.on_activate)

    def on_activate(self, linkbutton):
        print("INFO: you are visiting '%s'" % linkbutton.get_uri())


if __name__ == "__main__":
    win = GButton()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

link di riferimento:

torna all’indice degli appunti
Gtk3 LinkButton

Categorie:Gtk3, PyGObject, python Tag: , ,

PyGObject: Gtk.Label

13 Aprile 2020 Commenti chiusi

torna all’indice appunti

Label

Il widget Gtk.Label è un widget che permette di visualizzare testo non editabile.
Spesso viene utilizzata come “etichetta”, a fianco di una text-entry (Gtk.Entry).
La larghezza della label, sarà arrangiata in base alla lunghezza de testo che conterrà.
E’ possibile anche inserire testi multiriga, aggiugendo “/n”.
Può contenere markup e link.

Per creare una Label si utilizza il costruttore Gtk.Label(*args, **kwargs),
dove l’argomento più significativo è ovviamente “label”.

E’ possibile settare i parametri del widget anche successivamente alla sua costruzione, con i soliti
metodi getter e setter get_property(property_name) e
set_property(property_name, property_value):

 
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk
... 
>>> label = Gtk.Label()
>>> label.set_property("label", "some text")
>>> label.get_property("label")
'some text'

oppure con i metodi getter e setter specifici get_*property_name*() e
set_*property_name*(value):

 
>>> label.set_label("another text")
>>> label.get_text()
'another text'

Le properties principali sono:

Name Type Flags Short Description
angle float r/w/en L’angolo di rotazione della label
attributes Pango.AttrList r/w Una lista di style attributes da applicare al testo della label
cursor-position int r La posizione corrente del cursore (in caratteri)
ellipsize Pango.EllipsizeMode r/w/en Il posto dove applicare l’ellipse (“…”), se la label è più lunga dello spazio disponibile
justify Gtk.Justification r/w/en Il tipo di allineamento delle linee nel testo
label str r/w Il testo della label
lines int r/w/en Il numero desiderato di linee quando eseguiamo l’ellipsizing di una wrapped label
max-width-chars int r/w/en La massima larghezza della label (in caratteri)
mnemonic-keyval int r La mnemonic accelerator key della label
mnemonic-widget Gtk.Widget r/w Il widgetda attivare quando la mnemonic key della label viene premuta
pattern str w Una stringa con caratteri “_” nelle posizioni corrispondenti ai caratteri da sottolineare nel testo
selectable bool r/w/en Se il testo della label può essere selezionato
selection-bound int r La posizione della fine opposta della selezione, dal cursore (in caratteri)
single-line-mode bool r/w/en Se la label è in single line mode
track-visited-links bool r/w/en Se i link visitati rimangono tracciati (cambio di colore)
use-markup bool r/w/en Se il testo della label include XML markup. Vedi Pango.parse_markup()
use-underline bool r/w/en Se True, una sottolineatura nel testo indica, per il carattere successivo, la mnemonic accelerator key
width-chars int r/w/en La larghezza della label (in caratteri)
wrap bool r/w/en Se True esegue il wrap delle linee se il testo diventa troppo lungo
wrap-mode Pango.WrapMode r/w/en Se wrap è True, controlla come viene effettuato il line-wrapping

Segnali

I segnali principali sono:

Name Short Description
activate-current-link un keybinding-signal emesso quando l’utente attiva il link contenuto nella label;
activate-link un segnale emesso per attivare una URI;
copy-clipboard il segnale “::copy-clipboard” è un keybinding-signal emesso quando si copia il contenuto della label sul clipboard;
move-cursor il segnale “::move-cursor” è un keybinding-signal emesso quand si inizia un movimento del cursore;
populate-popup il segnale “::populate-popup” emesso prima di mostrare il context menu di una label;

Metodi

Di seguito i metodi utilizzabili con il widget Gtk.Label:

new():

Il costruttore per creare una nuova Gtk.Label.

new_with_mnemonic(str)

Un altro costruttore che crea una label impostandone direttamente il testo.
Utilizzando l’underscore davanti al carattere desiderato, si ottiene il carattere “mnemonic”
(alt + …). Se dovesse essere necessario far apparire l’underscore come carattere nella label,
dovrà essere indicato con 2 underscores consecutivi.

>>> label = Gtk.Label.new_with_mnemonic("_mnemonic label")
>>> label.get_text()
'mnemonic label'
>>> label = Gtk.Label.new_with_mnemonic("label__with__underscores")
>>> label.get_text()
'label_with_underscores'

I Parametri sono:
str: il testo della label;

get_angle()

Ritorna l’angolo di rotazione della label:

>>> label.get_angle()
0.0

get_attributes()

Ritorna la lista degli attributi settati precedentemente con il metodo set_attributes().

get_current_uri()

Ritorna l’URI attivo nella label. Il link attivo è quello sotto il puntatore del mouse, o, in una
label selezionabile, il link sul quale si trova il cursore.
Questa funzione è utile utilizzando l’handler “activate-link” o “query-tooltip”.

get_ellipsize()

Ritorna la posizione di “ellipsize” (“…”) quando non c’è abbastanza spazio per un testo.

get_justify()

Ritorna il tipo di giustificazione della label;
Il default per una label, è un enum di tipo GTK_JUSTIFY_LEFT.

get_label()

Ritorna il testo contenuto nel widget label, compresi gli mnemonic e gli eventuali Pango markup,
a differenza di get_text() che ritorna il testo puro.

>>> mlabel = Gtk.Label.new()
>>> mlabel.set_markup("<b>markup</b> label")
>>> mlabel.get_text()
'markup label'
>>> mlabel.get_label()
'<b>markup</b> label'

get_layout()

Ritorna il Pango.Layout utilizzato per visualizzare la label. Il layout è utile ad esempio per
convertire la text-position, in pixel-position.

get_layout_offsets()

Ritorna le coordinate x e y dove la label disegnerà il Pango.Layout che rappresenta il testo nella
label stessa. Utile per convertire i mouse events in coordinate nel Pango.Layout, ad esempio per
catturare azioni quando solo una parte della label viene cliccata.

get_line_wrap()

Ritorna True, se le linee nella label sono automaticamente “wrappate”.
Vedi set_line_wrap().

get_line_wrap_mode()

Ritorna il tipo di line-wrap (enum Pango.WrapMode) utilizzato nella label.

>>> mlabel.get_line_wrap_mode()
<enum PANGO_WRAP_WORD of type Pango.WrapMode>
>>> mlabel.get_line_wrap_mode().real
0

get_lines()

Ritorna il numero di linee alle quali una label wrappata o con ellipse, dovrebbe essere limitata.

get_max_width_chars()

Ritorna il valore massimo di larghezza della label, in caratteri.

get_mnemonic_keyval()

Ritorna il numero corrispondente alla mnemonic key settata per la label.
Se non è impostato alcun mnemonic, viene ritornato Gdk.KEY_VoidSymbol.

>>> mlabel = Gtk.Label.new_with_mnemonic("_mnemonic label")
>>> mlabel.get_mnemonic_keyval()
109
>>> chr(109)
'm'

get_mnemonic_widget()

Ritorna il target del mnemonic (keyboard shortcut) della label.

get_selectable()

Ritorna True, se la label è selectable, altrimenti False

get_selection_bounds()

Ritorna True se ci sono caratteri selezionati nella label, e se sì, le posizioni di start e di end
selection. Altrimenti ritorna False:

>>> mlabel.set_selectable(True)
>>> mlabel.select_region(2, 5)
>>> mlabel.get_selection_bounds()
(True, start=2, end=5)

get_single_line_mode()

Ritorna True se la label è in single line mode.

get_text()

Ritorna il testo della label senza eventuali mnemonic e Pango markups.

get_track_visited_links()

Ritorna True se la label sta tenendo traccia del link cliccati.

get_use_markup()

Ritorna True se il testo della label viene interpretato come “marked up” dal Pango markup language

>>> label = Gtk.Label("normal label")
>>> label.get_use_markup()
False
>>> markuplabel = Gtk.Label.new()
>>> markuplabel.set_markup("<b>markup</b> label")
>>> markuplabel.get_use_markup()
True

get_use_underline()

Ritorna True se l’underscore contenuto nella label, indica uno mnemonic.

get_width_chars()

Ritorna la larghezza della label, in charatteri

get_xalign()

Ritorna il valore della property xalign; i valori di xalign vanno da 0.0 a 1.0
0.0: indica allineamento a sinistra
1.0: indica allineamento a destra
0.5: indica la centratura orizzontale

get_yalign()

Ritorna il valore della property yalign; i valori di xalign vanno da 0.0 a 1.0
0.0: indica allineamento TOP
1.0: indica allineamento BOTTOM
0.5: indica la centratura verticale

select_region(start_offset, end_offset)

Seleziona un range di caratteri nella label.
Se la label non è selectable, questa funzione non ha effetto.
I Parametri sono:
start_offset: inizio della regione (in caratteri);
end_offset: fine della regione (in caratteri);

set_angle(angle)

Setta l’angolo di rotazione della label in senso antiorario:
90.0: legge la label dall’basso verso l’alto
270.0: legge la label dall’alto verso il basso
I Parametri sono:
angle: l’angolo di rotazione della label (0.0 a 359.5 gradi);

set_attributes(attrs)

Setta un lista di attributi Pango.AttrList che verrà integrata al testo della label e agli attributi
precedentemente settati.
Non è però raccomandato mescolare markup strings con attributi settati manualmente.
I Parametri sono:
attrs: la lista di attributi Pango.AttrList da settare alla label;

set_ellipsize(mode)

Setta il tipo di “ellipsize” (“…”), quando non c’è abbastanza spazio per un testo lungo.
Il tipo di ellipsize è un enum Pango.EllipsizeMode
e può assumere i seguenti valori:
NONE (0): nessuna ellipsization;
START (1): omette i caratteri all’inizio del testo;
MIDDLE (2): omette i caratteri a centro testo;
END (3): omette i caratteri alla fine del testo;

>>> from gi.repository import Pango
>>> label.set_ellipsize(Pango.EllipsizeMode.END)

I Parametri sono:
mode: il tipo di ellipsize mode (Pango.EllipsizeMode);

set_justify(jtype)

Setta l’allineamento delle linee nel testo della label.
Il valore di default è l’enum Gtk.Justification.LEFT.
Per settare l’allineamento dell’intera label invece, usare Gtk.Widget.set_halign().
Questo metodo non ha effetto su label con singola linea.
I Parametri sono:
jtype: il tipo di justification delle linee della label;

set_label(str)

Setta il testo della label e viene interpretata comprendendo eventuali underlines (per gli mnemonic)
e/o Pango markup.
I Parametri sono:
str: il testo da settare nella label;

set_line_wrap(wrap)

Setta il line wrapping nella label. Settando wrap a True, quando il testo eccede la larghezza del
widget, il testo viene spezzato.
Per le label che devono wrappare ad una specifica posizione, settare il size della label con il
metodo set_size_request().
I Parametri sono:
wrap: il boolean che setta o meno il wrapping delle linee;

set_line_wrap_mode(wrap_mode)

Se il wrap delle linee è attivo (set_line_wrap(True)), questo metodo controlla come viene effettuato
il wrap stesso.
Il default è un enum Pango.WrapMode.WORD, il quale esegue un wrap ai bordi della parola.
Gli enum disponibili sono:
WORD (0): wrap lines ai bordi della parola;
CHAR (1): wrap lines ai bordi del carattere;
WORD_CHAR (2): wrap lines ai bordi della parola, ma se non c’è spazio, passa ai bordi del carattere.
I Parametri sono:
wrap_mode: il tipo di wrap mode (Pango.WrapMode) delle linee;

set_lines(lines)

Setta il numero di linee alle quali una label con ellipse e wrapping attivi, deve essere limitata.
Ovviamente devono essere attivi il wrap e l’ellipse (“…”).
I Parametri sono:
lines: il numero delle linee sui cui ha effetto il wrapping e
l’ellipsize;

set_markup(str)

Esegue il parsing della stringa con il Pango text markup language, settando il
testo della label con gli attributi passati in str.
Questo metodo setta la property “use-markup” a True.
Se str contiene dati esterni, può essere necessario eseguire un “escape” su di essa con i metodi
markup_escape_text(), o g_markup_printf_escaped():
I Parametri sono:
str: il testo con markup da inserire nella label;

set_markup_with_mnemonic(str)

Esegue il parsing della stringa con il Pango text markup language, settando il testo
della label con gli attributi passati in str.
Se i caratteri della stringa sono preceduti da underscore, questi saranno i caratteri mnemonic.
I Parametri sono:
str: il testo con markup da inserire nella label con mnemonic;

set_max_width_chars(n_chars)

Setta la larghezza massima in caratteri della label.
I Parametri sono:
n_chars: la larghezza della label (in caratteri);

set_mnemonic_widget(widget)

Se la label ha uno mnemonic key, ad esempio usando metodi come set_markup_with_mnemonic(),
set_text_with_mnemonic(), new_with_mnemonic() o settando a True la property
“use_underline”, la label stessa verrà automaticamente associata al widget passato come argomento.
Il target widget riceverà il segnale “mnemonic-activate”. L’handler di default per questo segnale
attiverà il widget, se non ci saranno conflitti
con altri mnemonic, in caso contrario effettuerà il toggle focus tra i widget in conflitto.
I Parametri sono:
widget: il widget per gli mnemonic;

set_pattern(pattern)

Setta il pattern “underlines” nel testo della label.
Esempio: se il testo della label è “FooBarBaz”, passando un pattern di questo tipo “___ ___”
sottolineerà “Foo” and “Baz”, ma non “Bar”.
I Parametri sono:
pattern: il pattern da settare sul testo della label;

set_selectable(setting)

Settando “setting” a True, si permette il copia/incolla del testo della label.
I Parametri sono:
setting: il boolean che setta il testo della label selezionabile;

set_single_line_mode(single_line_mode)

Setta il “single line” mode nella label.
I Parametri sono:
single_line_mode: il boolean che setta il testo su una sola linea;

set_text(str)

Setta il testo della label, sovrascrivendo i precedenti contenuti, cancellando eventuali mnemonic
accelerators e settando a False, la property “use-underline”.
Come effetto collaterale, setterà a False anche la property “use-markup”.
I Parametri sono:
str: il testo da settare nella label;

set_text_with_mnemonic(str)

Setta il testo della label a str e i caratteri preceduti da underscore, verranno interpretati
come keybord accelerators.
I Parametri sono:
str: il testo della label con gli mnemonic;

set_track_visited_links(track_links)

settando a True “track_links”, la label terrà traccia dei link cliccati (cambio di colore):
I Parametri sono:
track_links: il boolean che attiva settato a True, tiene traccia
visivamete, dei link visitati;

set_use_markup(setting)

Mettendo a True “setting”, vuol dire che la label conterrà markup in Pango’s markup language.
I Parametri sono:
setting: il boolean che permette di usare o meno il markup language;

set_use_underline(setting)

Settando a True “setting”, indichiamo che i caratteri preceduti da underscore, saranno mnemonic
accelerator key.
I Parametri sono:
setting: il boolean che setta o meno, l’uso degli underline, che
definiscono i caratteri da utilizzare per gli mnemonic accelerator key;

set_width_chars(n_chars)

Setta la larghezza in caratteri desiderata (non la massima ammessa).
I Parametri sono:
n_chars: la larghezza desiderata della label, in caratteri;

set_xalign(xalign)

Setta la property “xalign” al valore passato come argomento. I valori di xalign vanno da 0.0 (LEFT)
a 1.0 (RIGHT); 0.5 indica centrato orizzontalmente.
I Parametri sono:
xalign: l’allineamento della label (0.0 – 1.0);

set_yalign(yalign)

Setta la property “yalign” al valore passato come argomento. I valori di yalign vanno da 0.0 (TOP)
a 1.0 (BOTTOM); 0.5 indica centrato verticalmente.
I Parametri sono:
yalign: l’allineamento della label (0.0 – 1.0);

Pango’s Markup Language

Per tutto quello che concerne il Pango’s Markup Language, descrizione, sintassi e abbreviazioni,
fare riferimento alla pagina di Gnome Developers

Di seguito un codice d’esempio:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Pango


class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Label Example")
        self.set_default_size(width=200, height=50)
        label = Gtk.Label.new_with_mnemonic("label__with__underscores")
        mlabel = Gtk.Label.new_with_mnemonic("_mnemonic label")
        e_label = Gtk.Label(label="a very long, long, long, long, long text")
        e_label.set_ellipsize(Pango.EllipsizeMode.END)
        markuplabel = Gtk.Label.new()
        markuplabel.set_markup('<span foreground="blue" weight="bold">'
                               'markup</span>'
                               ' <span background="white" '
                               'foreground="red" style="italic">'
                               'label</span>')
        dlabel = Gtk.Label.new("diagonal")
        dlabel.set_angle(45.0)

        hbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)

        hbox.pack_start(label, True, True, 0)
        hbox.pack_start(mlabel, True, True, 0)
        hbox.pack_start(e_label, True, True, 0)
        hbox.pack_start(markuplabel, True, True, 0)
        hbox.pack_start(dlabel, True, True, 0)
        self.add(hbox)


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 Label

Categorie:Gtk3, PyGObject, python Tag: , ,