Home > Gtk3, PyGObject, python > PyGobject: Gtk.Button

PyGobject: Gtk.Button

13 Aprile 2020

torna all’indice appunti

Button

Il widget Gtk.Button viene generalmente collegato ad una callback che viene invocata quando lo
stesso widget viene premuto.
Come accade per altri widget, il Gtk.Button può contenere altri widget (child), come ad esempio
Testi (Label) o immagini.

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

 
>>> button = Gtk.Button()
>>> button
<Gtk.Button object at 0xb4a36edc (GtkButton at 0x88e3330)>

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):

 
>>> button.get_property("label")
>>> button.set_property("label", "Click")
>>> button.get_property("label")
'Click'

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

 
>>> button.set_label("OK")
>>> button.get_label()
'OK'

Per creare un Button, esiste un metodo “scorciatoia”, new_with_label(label):

 
button1 = Gtk.Button.new_with_label("Click")

Le properties principali di un Gtk.Button sono:

Image

Per inserire un’immagine all’interno del widget, creiamo prima un oggetto Gtk.Image e lo settiamo
nel widget che lo conterrà:

 
>>> btn_ok = Gtk.Button(label="Click")
>>> image = Gtk.Image.new_from_file("OK24.png")
>>> btn_ok.set_image(image)
>>> btn_ok.get_image()
<Gtk.Image object at 0xb4a36dec (GtkImage at 0x88ea460)>

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):

 
>>> def on_click(button):
...     print("Button '%s' was clicked!" % button.get_label())
...     
>>> btn_ok.connect("clicked", on_click)
104
>>> btn_ok.clicked()
Button <Click> was clicked!

Come si nota, con il metodo clicked() abbiamo emesso il segnale “clicked” e la
callback è stata invocata. Questo corrisponde alla pressione del Button.
L’Integer ritornato dal metodo coonect(), invece, è l’ID-Handler che gestisce appunto la connessione
segnale-callback.
Con lo stesso ID, sarà infatti possibile disconnettere la callback dal segnale:

 
>>> btn_ok.disconnect(104)
>>> btn_ok.clicked()

Metodi

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

clicked()

emette un segnale di tipo “clicked”.

get_alignment()

ritorna l’allineamento orizzontale (xalign) e quello verticale (yalign) del widget;
“xalign” può assumere i valori: 0.0 per allineamento a sinistra, 1.0 per allineamento a destra;
“yalign” può assumere i valori: 0.0 per allineamento in alto, 1.0 per allineamento in basso;
0.5 ovviamente sta per centrato, sia orizzontalmente che verticalmente.

>>> btn_ok.get_alignment()
(xalign=0.5, yalign=0.5)

get_focus_on_click()

ritorna True se il Button dopo il click, trattiene il focus.

get_image()

ritorna l’oggetto Image utilizzato nel Button o None se assente;

get_image_position()

ritorna la posizione dell’immagine all’interno del widget.

>>> btn_ok.get_image_position()
<enum GTK_POS_LEFT of type Gtk.PositionType>

get_label()

ritorna il testo associato al Button.

get_relief()

ritorna lo stile “relief” settato per il Button.

get_use_underline()

ritorna True se viene utilizzato il mnemonic underline (accelerator key).

new()

E’ un metodo costruttore, crea un nuovo Gtk.Button.
In seguito possono essere settati i parametri (es. la Label), con i setter dedicati.

set_alignment(xalign, yalign)

setta l’allineamento del child. I valori di allineamento sono:
0.0 per allineamento a sinistra, 1.0 per allineamento a destra, 0.0 per allineamento in alto, 1.0
per allineamento in basso. Per l’allineamento centrato, si utilizza ovviamente 0.5.
I parametri sono:
xalign: il valore di allineamento orizzontale;
yalign: il valore di allineamento verticale;

set_always_show_image(always_show)

Settato a True, il Button visualizzerà sempre l’immagine (se disponibile), sovrascrivendo nel caso,
il Gtk.Settings “gtk-button-images”.
I parametri sono:
always_show: il boolean che a True visualizza sempre l’immagine;

set_image(image)

setta l’immagine nel Button.
I parametri sono:
image: il widget da settare come immagine;

set_image_position(position)

setta la posizione dell’immagine, rispetto al testo del Button.
Position è un enum di tipo Gtk.PositionType e può assumere i seguenti valori;
LEFT (0): immagine a sinistra rispetto al testo;
RIGHT (1): immagine a destra ridpetto al testo;
TOP (2): immagine sopra e testo sotto;
BOTTOM (3): immagine sotto e testo sopra:

>>> btn_ok.set_image_position(Gtk.PositionType(1))
>>> btn_ok.get_image_position()
<enum GTK_POS_RIGHT of type Gtk.PositionType>

I parametri sono:
position: l’enum Gtk.PositionType della posizione dell’immagine
rispetto al testo del Button;

set_relief(relief)

setta il “relief” style del Button. Il relief style può assumere i seguenti valori:
Gtk.ReliefStyle.NORMAL e Gtk.ReliefStyle.NONE.
I parametri sono:
relief: enum Gtk.ReliefStyle che indica il relief style del button;

set_use_underline(use_underline)

se “use_underline” è True, viene indicata con una sottolineatura, il carattere che dovrebbe essere
usato come accelerator key (il carattere nella label è anticipato da un underscore);
I parametri sono:
use_underline: il boolean che visualizza le accelerator keys;

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="Gtk3 Button")
        self.set_default_size(width=300, height=50)
        self.set_border_width(5)  # sets space around the inner widget (hbox)
        btn_ok = Gtk.Button.new_with_label("Click")
        image = Gtk.Image.new_from_file("OK24.png")
        btn_ok.set_image(image)
        btn_close = Gtk.Button.new_with_label("Close")
        hbox = Gtk.Box(spacing=3)  # spacing tra widgets
        self.add(hbox)

        # layout
        hbox.pack_start(child=btn_ok, expand=True, fill=True, padding=0)
        hbox.pack_start(child=btn_close, expand=True, fill=True, padding=0)
        hbox.set_homogeneous(True)

        # bindings
        btn_ok.connect("clicked", self.on_click)
        btn_close.connect("clicked", self.on_close)

    @staticmethod
    def on_click(button):
        label = "Click" if button.get_label() == "Clicked" else "Clicked"
        button.set_label(label=label)
        print("'%s' button was clicked" % label)

    @staticmethod
    def on_close(button):
        label = button.get_label()
        print("'%s' button was clicked" % label)
        Gtk.main_quit()


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

link di riferimento:

torna all’indice appunti
Gtk3 Button

Categorie:Gtk3, PyGObject, python Tag: , ,
I commenti sono chiusi.
Name Type Flags Short Description
always-show-image bool r/w/c/en Se l’immagine verrà sempre visualizzata
image Gtk.Widget r/w/en Il Child widget visualizzato a fianco del testo del button
image-position Gtk.PositionType r/w/en La posizione dell’immagine relativamente al testo
label str r/w/c/en Il testo del widget label nel button (se il button ne contiene una)
relief Gtk.ReliefStyle r/w/en Lo stile del bordo del button
use-underline bool r/w/c/en Se settato, l’underline prima di un carattere, ne identifica il mnemonic accelerator key