bancaldo.altervista.org Open in urlscan Pro
104.21.75.212  Public Scan

Submitted URL: https://www.bancaldo.altervista.org/
Effective URL: https://bancaldo.altervista.org/
Submission: On August 21 via automatic, source certstream-suspicious — Scanned from US

Form analysis 1 forms found in the DOM

GET https://bancaldo.altervista.org

<form action="https://bancaldo.altervista.org" method="get">
  <div class="content">
    <input type="text" class="textfield searchtip" name="s" size="24" value="">
    <input type="submit" class="button" value="">
  </div>
</form>

Text Content

BANCALDO™

I n t e r d i b i l e

 * Home
 * Statuto F.C.Inter 1908
 * Grosso Guaio a ChinaTown
 * 





PYGOBJECT: GTK.BUILDER

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

Builder

Un Gtk.Builder è un oggetto che legge una descrizione testuale di una UI e ne
istanzia gli
oggetti, in essa descritti.
Per creare un Gtk.Builder da una descrizione testuale, si utilizza il metodo
Gtk.Builder.new_from_file(), se la stringa che descrive la UserInterface è
contenuta in un file, oppure Gtk.Builder.new_from_resource(), oppure
Gtk.Builder.new_from_string() se abbiamo un’unica stringa descrittiva.
Il Gtk.Builder tiene un riferimento di tutti gli oggetti che crea fino a che non
finalizza la UI.
Le funzioni Gtk.Builder.get_object() e Gtk.Builder.get_objects()
vengono usate per accedere ai widgets della UI, grazie ai nomi assegnati ad essi
all’interno della
descrizione testuale della UI.
Le Toplevel windows ritornate da queste funzioni rimarranno “vive” fino a chè
l’utente non le
distruggerà esplicitamente con il metodo Gtk.Widget.destroy().
Se la UI definition viene inserita in un file, è convenzione dara a tale file,
estensione “.ui”
Faremo riferimento a questa descrizione come “Gtk.Builder UI definitions” e non
sarà da confondere
con “GtkUIManager UI Definitions”, che è molto più limitata.

Gtk.Builder UI definitions Syntax

Gtk.Builder esegue l’analisi (parsing) della descrizione testuale della UI in
formato XML secondo
lo schema seguente:

L’elemento toplevel è

1
<interface>

.
Opzionalmente accetta un attributo “domain” che farà cercare al builder le
stringhe tradotte in
base al dominio specificato. Questo si ottiene anche chiamando il metodo
Gtk.Builder.set_translation_domain().
Gli oggetti sono descritti nei tag , che possono contenere elementi , che
descrivono le proprietà
degli oggetti (elementi), che connettono i segnali agli handlers, ed elementi ,
che descrivono i
child objects (molto spesso i widgets dentro ai contenitori, ma anche le actions
dentro agli
action group, o le colonne nel tree-model).
Banalmente un elemento contiene un altro elemento elemento che descrive il child
object.
La versione del toolkit viene descritta dall’elemento

1
<requires>

.
L’attributo “lib” specifica la libreria dei widget (attualmente l’unica
supportata è “gtk+”).
L’attributo “version” specifica la versione in formato

1
<major>.<minor>

.
Se i requisiti di versione non vengono raggiunti, il builder darà errore.

Il tipo di oggetto rappresentato da un elemento viene specificato dall’attributo
“class”.
Se il tipo di oggetto non è ancora stato caricato, GTK+ tenta di trovare il
metodo
get_type() dal nome della classe; questo funziona quasi sempre, in caso
contrario
è possibile specificare il nome della funzione get_type() esplicitamente, usando
l’attributo
“type-func”.
Come caso speciale, Gtk.Builder permette di usare un oggetto che è stato
costruito da un
Gtk.UIManager in un’altra parte della definizione UI, specificando l’id del
Gtk.UIManager nell’attributo “constructor” ed il nome dell’oggetto,
nell’attributo “id”.

Agli oggetti è possibile dare un nome con l’attributo “id”, che a sua volta
permette all’app di
recuperare l’oggetto, tramite il medodo del builder Gtk.Builder.get_object(id).

Il settaggio delle properties degli oggetti è molto semplice grazie all’elemento

1
<property>

.
L’attributo “name” è il nome della property e il contenuto dell’elemento, il suo
valore.
Se l’attributo “translatable” è settato a True, GTK+ userà gettext()
(o dgettext() se il builder ha settato un translation domain) per la traduzione
del valore.
Gtk.Builder può fare l’analisi di testi che rappresentino i tipi più comuni di
properties:
caratteri, stringhe, interi, numeri floating-point, booleans (stringhe come
“True”, “t”, “yes”,
“y”, “1” sono interpretate come True, mentre stringhe come “False”, “f”, “no”,
“n”, “0”,
interpretate come False), enums (possono essere specificati con il loro “name”,
“nick” o
valore intero), flags (possono essere specificate dal loro “name”, “nick”,
valore intero,
opzionalmente combinate con “|”, ad esempio “GTK_VISIBLE|GTK_REALIZED”) e colori
(in un formato
leggibile con Gdk.RGBA.parse()).
GVariants vengono specificati nel formato leggibile da GLib.Variant.parse(), e
pixbufs specificati come filename di un file immagine da caricare.

I Signal handlers sono settati con l’elemento

1
<signal>

.
L’attributo “name” specifica il nome del segnale, e l’attributo “handler”,
specifica la funzione
da connettere al segnale.

A volte è necessario fare riferimento a widget che sono stati costruiti in
maniera implicita da
GTK+ come parte di un widget composto, per settare le properties su di essi
aggiungere ulteriori
children (ad esempio il vbox di un Gtk.Dialog).
Questo può essere ottenuto settando la property “internal-child” dell’elemento a
True.

I widgets hanno posti diversi dove aggiungere un child (ad esempio i contenuti
di tabs e page nei
notebooks). Questo può essere definito nella “UI definition” specificando
l’attributo “type”
nell’elemento

1
<child>

.

Un esempio di UI Definition per Gtk.Builder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<interface>
  <object class="GtkDialog" id="dialog1">
    <child internal-child="vbox">
      <object class="GtkBox" id="vbox1">
        <property name="border-width">10</property>
        <child internal-child="action_area">
          <object class="GtkButtonBox" id="hbuttonbox1">
            <property name="border-width">20</property>
            <child>
              <object class="GtkButton" id="ok_button">
                <property name="label">gtk-ok</property>
                <property name="use-stock">TRUE</property>
                <signal name="clicked" handler="ok_button_clicked"/>
              </object>
            </child>
          </object>
        </child>
      </object>
    </child>
  </object>
</interface>

Le properties principali sono:

Name Type Flags Short Description translation-domain str r/w Il translation
domain usato da gettext()

Metodi

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

new()

Crea un nuovo oggetto Gtk.Builder vuoto.
Questo metodo è utile nel caso si vogliano caricare porzioni di descrizione
derivanti da fonti
diverse, con metodi come Gtk.Builder.add_from_file(),
Gtk.Builder.add_from_resource(), o Gtk.Builder.add_from_string().
Qualora la sorgente dovesse essere unica, sarebbero più comodi i class_methods
Gtk.Builder.new_from_file(), Gtk.Builder.new_from_resource(),
o Gtk.Builder.new_from_string().

new_from_file(filename)

Costruisce la UI definition presente nel filename passato come argomento.
Parametri:
filename: il nome del file contenente la UI description

new_from_resource(resource_path)

Costruisce la UI definition presente alla resource_path.
Parametri:
resource_path: l’oggetto Gio.Resource con il resource path;

new_from_string(string, length)

Costruisce la UI definition descritta dalla stringa.
Parametri:
string: la stringa contenente la UI definition (XML);
length: la lunghezza della stringa, o -1 se la stringa è None-terminated;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
>>> 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>
...   </object>
... </interface>
... """
>>> builder = Gtk.Builder.new_from_string(TOOLBAR_INFO, -1)

add_callback_symbol(callback_name, callback_symbol)

Aggiunge il callback_symbol allo scope del builder sotto il nome della callback.
Questo metodo sovrascrive cioò che è stato settato con il metodo
Gtk.Builder.connect_signals(),
per ogni callback symbols che viene aggiunto.
L’utilizzo di questo metodo permette un miglior incapsulamento inquanto non
occorre dichiarare i
callback symbols nel global namespace.
Parametri:
callback_name: il nome della callback, come previsto nell’XML;
callback_symbol: il GObject.Callback, ovver il callback pointer;

add_from_file(filename)

Esegue l’analisi di un file contenente una UI definition e la unisce con il
contenuto corrente del
builder. Se la UI definition risiede in un unico file è consigliabile l’utilizzo
di
Gtk.Builder.new_from_file().
Parametri:
filename: il nome file di cui analizziamo il contenuto (parsing);

add_from_resource(resource_path)

Analizza un resource file con una UI definition e la unisce al contenuto
corrente del builder.
Se la UI definition risiede in un unico resource file è consigliabile l’utilizzo
di
Gtk.Builder.new_from_resource().
Parametri:
resource_path: il percorso del resource file da analizzare;

add_from_string(buffer, length=-1)

Analizza una stringa contenente una UI definition e la unisce al contenuto
corrente del builder.
Se la UI definition risiede in un unica stringa è consigliabile l’utilizzo di
Gtk.Builder.new_from_string().
Parametri:
buffer: la stringa da analizzare;
length: la lunghezza del buffer;

add_objects_from_file(filename, object_ids)

Analizza un file contenente una UI definition costruendo solo gli oggetti
richiesti e li unisce
al contenuto corrente del builder. Se stiamo aggiungendo un oggetto che dipende
da un oggetto che
non è suo child (ad esempio un Gtk.TreeView che dipende dal proprio
Gtk.TreeModel), dobbiamo
metterlo esplicitamente nella lista object_ids.
Parametri:
filename: il nome del file da analizzare;
object_ids: una lista di stringhe con gli oggetti da costruire;

add_objects_from_resource(resource_path, object_ids)

Analizza un resource file contenente una UI definition costruendo solo gli
oggetti richiesti e li
unisce al contenuto corrente del builder. Se stiamo aggiungendo un oggetto che
dipende da un
oggetto che non è suo child (ad esempio un Gtk.TreeView che dipende dal proprio
Gtk.TreeModel),
dobbiamo metterlo esplicitamente nella lista object_ids.
Parametri:
resource_path: il percorso del resource file da analizzare;
object_ids: la lista “nul-terminated” di stringhe corrispondenti
agli oggetti da costruire;

add_objects_from_string(buffer, object_ids)

Analizza una stringa contenente una UI definition costruendo solo gli oggetti
richiesti e li
unisce al contenuto corrente del builder. Se stiamo aggiungendo un oggetto che
dipende da un
oggetto che non è suo child (ad esempio un Gtk.TreeView che dipende dal proprio
Gtk.TreeModel),
dobbiamo metterlo esplicitamente nella lista object_ids.
Parametri:
buffer: la stringa da analizzare;
object_ids: una lista di stringhe con gli oggetti da costruire;

connect_signals(self, obj_or_map)

Connette i segnali specificati ai rispettivi handler, come indicato nel
dizionario passato come
argomento. L’handler (value) del segnale (key), può anche essere una tupla in
forma
(handler [,arg1 [,argN]]), se all’handler è necessario passare degli argomenti.
esempio di applicazione:

1
builder.connect_signals({'on_clicked': (on_clicked, arg1, arg2)})

Parametri:
obj_or_map: il dizionario dove chiave/valore sono rispettivamente
il segnale e l’handler corrispondente;

connect_signals_full(func, *user_data)

Utilizza una funzione per connettere i segnali.
Parametri:
func: l’oggetto Gtk.BuilderConnectFunc, cioè la funzione usata
per connettere i segnali;
user_data: i dati che possono essere passati alla funzione;

expose_object(name, object)

Aggiunge un oggetto all’ oggetto condiviso del builder cosicchè possa essere
referenziato dagli altri oggetti costruiti dal builder.
Parametri:
name: il nome dell’oggetto “esposto” al builder;
object: l’oggetto da esporre;

get_application()

Ritorna l’oggetto Gtk.Application associato al builder, oggetto utilizzato per
creare i proxies
delle actions come richiesto dall’XML che il builder sta caricando. Di default,
il builder usa
l’application di default (Gio.Application.get_default()).
Se vuoi usare un’altra application per la costruzione dei proxies, usare il
metodo
Gtk.Builder.set_application().

get_object(name)

Ritorna l’oggetto con il nome passato come argomento.
Parametri:
name: il nome dell’oggetto che vogliamo recuperare dal builder;

1
2
3
4
>>> builder.get_object("new_button")
<Gtk.ToolButton object at 0x00000000035b5f40 (GtkToolButton at
0x000000000318d1c0)>
>>> builder.get_object("new_button").get_label()
'New'

get_objects()

Ritorna tutti gli oggetti che sono stati costruiti dal builder.

1
2
3
4
5
>>> for obj in builder.get_objects():
...     print(type(obj))
...    
<class 'gi.overrides.Gtk.ToolButton'>
<class 'gi.repository.Gtk.Toolbar'>

get_translation_domain()

Ritorna il translation domain del builder.

get_type_from_name(type_name)

Ritorna il tipo di oggetto (GObject.GType) dal nome passato come argomento, o
GObject.TYPE_INVALID
se nessun tipo viene trovato.
Parametri:
type_name: il nome da cui ricavare il tipo di oggetto;

1
2
3
4
>>> builder.get_type_from_name("GtkToolbar")
<GType GtkToolbar (80271280)>
>>> builder.get_type_from_name("GtkToolButton")
<GType GtkToolButton (54634240)>

set_application(application)

Associa l’applicazione al builder.
Questo metodo si usa solo se ci sono più di un oggetto Gio.Application nel
nostro processo.
Parametri:
application: l’oggetto Gtk.Application da associare al builder,
non può essere None;

set_translation_domain(domain)

Setta il translation domain del builder.
Parametri:
domain: la stringa con il translation domain o None;

value_from_string(pspec, string)

Questa funzione converte la rappresentazione XML di un valore, nell’oggetto di
default
(demarshal). In pratica il metodo chiama GObject.Value.init()
sul valore, così non deve essere inizializzato anticipatamente.
Questa funzione può gestire i tipi di valore str, uchar, boolean, int, uint,
long, ulong, enum,
flags, float, double, string, Gdk.Color, Gdk.RGBA e Gtk.Adjustment
Parametri:
pspec: l’oggetto GObject.ParamSpec per la property;
string: la stringa che rappresenta il valore;

value_from_string_type(type, string)

Come il metodo Gtk.Builder.value_from_string(), questo esegue il demarshal di un
valore da una stringa, ma prende un oggetto GObject.GType invece di un oggetto
GObject.ParamSpec.
In pratica il metodo chiama GObject.Value.init() sul valore, così non deve
essere inizializzato anticipatamente.
Parametri:
type: il GObject.GType del valore;
string: la stringa che rappresenta il valore;

Ecco un codice di esempio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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')
        tool_bar.set_style(Gtk.ToolbarStyle.BOTH)
        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()

link di riferimento:

torna all’indice degli appunti
Gtk3 Builder


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python


PYGOBJECT: GTK.IMAGE

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

Image

Il widget Gtk.Image visualizza un’immagine.
Generalmente verrà caricato un GdkPixbuf.Pixbuf (“pixel buffer”) da un file.
La classe Gtk.Image fornisce un metodo per fare questa operazione,
Gtk.Image.new_from_file():

1
2
3
4
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk, Gio
>>> image = Gtk.Image.new_from_file("image.png")

Se l’immagine non verrà caricata correttamente, l’oggetto image conterrà una
icona “broken image”.
Come detto in precedenza, caricare un’immagine passando da un oggetto
GdkPixbuf.Pixbuf
permetterà di gestire gli eventuali errori in caricamento:

1
2
3
4
5
6
7
8
>>> from gi.repository import GdkPixbuf
>>> pixbuf = GdkPixbuf.Pixbuf.new_from_file("image.png")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
gi.repository.GLib.GError: g-file-error-quark: Apertura del file «image.png» non
riuscita: No such file or directory (4)
>>> # correggiamo il percorso o aggiungiamo il file mancante
>>> pixbuf = GdkPixbuf.Pixbuf.new_from_file("image.png")
>>> image = Gtk.Image.new_from_pixbuf(pixbuf)

Il file image può anche contenere un’animazione, in tal caso Gtk.Image
visualizzerà l’animazione
via GdkPixbuf.PixbufAnimation, invece che un’immagine statica.
L’oggetto Gtk.Image è una sottoclasse di Gtk.Misc, che implica che possiamo
allinearla (center, left, right) e aggiungere il padding ad essa, grazie ai
metodi di Gtk.Misc.
Gtk.Image è un widget “no window”, che significa che non riceve eventi.
Se vogliamo ricevere eventi sull’oggetto image, ad esempio quando clicchiamo
sopra all’immagine,
dobbiamo inserirlo dentro ad un widget Gtk.EventBox,
quindi connettere i segnali all’eventbox stesso.

Le properties principali sono:

Name Type Flags Short Description file str r/w il nome del file da caricare e
visualizzare gicon Gio.Icon r/w La Gio.Icon che sarà visualizzata icon-name str
r/w Il nome dell’icona dell’icon theme icon-size int r/w/en Il Symbolic size da
usare per stock icon, icon set o named icon pixbuf GdkPixbuf.Pixbuf r/w Il
GdkPixbuf.Pixbuf da visualizzare pixbuf-animation GdkPixbuf.PixbufAnimation r/w
il GdkPixbuf.PixbufAnimation da visualizzare pixel-size int r/w/en Pixel size to
use for named icon resource str r/w Il resource path da visualizzare
storage-type Gtk.ImageType r la rappresentazione da usare per i dati immagine
surface cairo.Surface r/w Il cairo.Surface da visualizzare use-fallback bool
r/w/en Se usare gli icon names fallback

Metodi

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

new()

Crea un nuovo widget Gtk.Image vuoto.

new_from_animation(animation)

Crea una Gtk.Image che visualizza l’animazione data.
I frames dell’animazione vengono visualizzati usando un timeout con
GLib.PRIORITY_DEFAULT.
Quando usiamo le animations per indicare che l’applicazione sta lavorando,
ricordarsi che tali
animazioni verranno visualizzate solo se il main loop non è occupato da un
processo con priorità maggiore.
Parametri:
animation: l’oggetto GdkPixbuf.PixbufAnimation con l’animazione;

new_from_file(filename)

Crea un nuovo Gtk.Image che visualizza il file passato come argomento.
Se il file non viene trovato o non può essere caricato, il Gtk.Image risultante
visualizzeà una
icona “broken image” icon.
Questo metodo non ritorna mai None, ma sempre un widget Gtk.Image valido.
Se il file contiene un’animazione, allora il widget image conterrà
un’animazione.
Se vogliamo gestire gli errori di caricamento file (ad esempio l’assenza del
file nel percorso
di ricerca), è necessario usare GdkPixbuf.Pixbuf.new_from_file() per caricare il
file, quindi creare il widget Gtk.Image dal pixbuf precedente.
Per le animazioni, per la stessa ragione, usare
GdkPixbuf.PixbufAnimation.new_from_file().
Parametri:
filename: la stringa con il nome file che contiene l’immagine;

new_from_gicon(icon, size)

Crea un widget Gtk.Image che visualizza una icona dal tema icone corrente.
Se il nome icona non è riconosciuto, verrà visualizzata un’icona di tipo “broken
image”.
Se viene modificato il tema icone, l’icona sarà aggiornata.
Parametri:
icon: un oggetto Gio.Icon che rappresenta un’icona;
size: un oggetto Gtk.IconSize con la dimensionde dell’icona;

new_from_icon_name(icon_name, size)

Crea un widget Gtk.Image che visualizza un’icona da tema icone corrente.
Se il nome icona non è riconosciuto, verrà visualizzata un’icona di tipo “broken
image”.
Se viene modificato il tema icone, l’icona sarà aggiornata.
Parametri:
icon_name: una stringa con il nome icona, o None;
size: un oggetto Gtk.IconSize con la dimensionde dell’icona;

new_from_pixbuf(pixbuf)

Crea un widget Gtk.Image che visualizza un pixbuf.
Questo metodo crea solo un widget Gtk.Image dal pixbuf, ma non reagirà ai
cambiamenti di stato.
E’ consigliabile in tal caso utilizzare Gtk.Image.new_from_icon_name().
Parametri:
pixbuf: il ‘oggetto GdkPixbuf.Pixbuf da cui creare il widget
Gtk.Image, o None;

new_from_resource(resource_path)

Crea un widget Gtk.Image che visualizza il resource file.
Se il file non viene trovato o non può essere caricato, il widget image
risultante, mostrerà
un’immagine di tipo “broken image”.
Questo metodo ritorna sempre un widget Gtk.Image valido e mai None.
Se il file contiene un’animazione, allora il widget image conterrà
un’animazione.
Se vogliamo gestire gli errori di caricamento file (ad esempio l’assenza del
file nel percorso
di ricerca), è necessario usare GdkPixbuf.Pixbuf.new_from_file() per caricare il
file, quindi creare il widget Gtk.Image dal pixbuf precedente.
Per le animazioni, per la stessa ragione, usare
GdkPixbuf.PixbufAnimation.new_from_file().
Parametri:
resource_path: la stringa che rappresenta un resource path;

new_from_surface(surface)

Crea un widget Gtk.Image che visualizza un surface.
Parametri:
surface: un oggetto cairo.Surface o None.

clear()

Svuota il widget Gtk.Image dai suoi contenuti.

get_animation()

Ritorna l’oggetto GdkPixbuf.PixbufAnimation visualizzato dal widget Gtk.Image.
Lo storage type dell’immagine deve essere uno tra Gtk.ImageType.EMPTY,
o Gtk.ImageType.ANIMATION (vedere Gtk.Image.get_storage_type()).

get_gicon()

Ritorna una tupla con gli oggetti Gio.Icon e Gtk.IconSize, del widget Gtk.Image.
Lo storage type dell’immagine deve essere Gtk.ImageType.EMPTY, o
Gtk.ImageType.GICON
(vedere Gtk.Image.get_storage_type()).

get_icon_name()

Ritorna una tupla con il nome dell’icona e l’oggetto Gtk.IconSize delle
dimensioni della stessa.
Lo storage type dell’immagine deve essere Gtk.ImageType.EMPTY, o
Gtk.ImageType.ICON_NAME
(vedere Gtk.Image.get_storage_type()).

get_pixbuf()

Ritorna il GdkPixbuf.Pixbuf visualizzato dal widgetg Gtk.Image.
Lo storage type dell’immagine deve essere Gtk.ImageType.EMPTY, o
Gtk.ImageType.PIXBUF
(vedere Gtk.Image.get_storage_type()).

get_pixel_size()

Ritorna la dimensione in pixel, utilizzata per le named icons.

get_storage_type()

Ritorna il tipo di rappresentazione usato dal Gtk.Image per salvare i dati
dell’immagine.
Se Gtk.Image non ha dati immagine il valore ritornato sarà Gtk.ImageType.EMPTY.

1
2
>>> image.get_storage_type()
<enum GTK_IMAGE_PIXBUF of type Gtk.ImageType>

set_from_animation(animation)

Fa sì che il widget Gtk.Image visualizzi l’animazione data.
Parametri:
animation: l’oggetto GdkPixbuf.PixbufAnimation che rappresenta
l’animazione da visualizzare o None;

set_from_file(filename)

Vedere il class method Gtk.Image.new_from_file().
Parametri:
filename: la stringa con il nome del file o None;

set_from_gicon(icon, size)

Vedere Gtk.Image.new_from_gicon().
Parametri:
icon: un oggetto Gio.Icon che rappresenti un’icona;
size: un oggetto Gtk.IconSize con la dimensione dell’icona;

set_from_icon_name(icon_name, size)

vedere Gtk.Image.new_from_icon_name().
Parametri:
icon_name: la stringa con il nome dell’icona o None;
size: un oggetto Gtk.IconSize con la dimensione dell’icona;

set_from_pixbuf(pixbuf)

Vedere Gtk.Image.new_from_pixbuf().
Parametri:
pixbuf: un oggetto GdkPixbuf.Pixbuf o None;

set_from_resource(resource_path)

Vedere Gtk.Image.new_from_resource().
Parametri:
resource_path: la stringa con il resource path o None;

set_from_surface(surface)

Vedere Gtk.Image.new_from_surface().
Parametri:
surface: un oggetto cairo.Surface o None;

set_pixel_size(pixel_size)

Setta la dimensione in pixel da usare per le named icons. Se il pixel_size viene
settato ad un
valore positivo, tale valore verrà usato al posto dell’icon size settato dal
metodo
Gtk.Image.set_from_icon_name().
Parametri:
pixel_size: la dimensione in pixel da settare per le named icons;

Nota:
siccome Gtk.IconSize è deprecato, per creare un’icona è conveniente passare
attraverso Gtk.IconTheme.
Il procedimento è semplice:
si ottiene il default icon-theme con il metodo Gtk.IconTheme.get_default() e
con l’oggetto Gtk.IconTheme ritornato si chiama il metodo
Gtk.IconTheme.load_icon(icon_name, size, flags), che restituisce l’oggetto
pixbuf
relativo all’icona desiderata.
Infine si creerà il widget Gtk.Image con il metodo
Gtk.Image.new_from_pixbuf(pixbuf).

Di seguito un codice di esempio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
 
 
class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Image example")
 
        box = Gtk.Box(spacing=6)
        box.set_homogeneous(True)
        default_theme = Gtk.IconTheme.get_default()
        for icon_name in ("edit-copy", "edit-paste",
                          "mail-send-receive-symbolic"):
            pixbuf = default_theme.load_icon(icon_name, 64, 0)
            icon_image = Gtk.Image.new_from_pixbuf(pixbuf)
            box.pack_start(icon_image, True, True, 0)
        image = Gtk.Image.new_from_file("image.png")
        box.pack_start(image, True, True, 0)
        self.add(box)
 
 
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 Image
Adwaita icon theme


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python


PYGOBJECT: GDKPIXBUF.PIXBUF

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

Pixbuf

Il widget GdkPixbuf.Pixbuf è la struttura principale della libreria GdkPixbuf.
Viene usato per rappresentare un’immagine e contiene tutte le informazioni della
stessa come:
i dati dei pixel dell’immagine, il suo color space, i bits per sample,
larghezza e altezza e il rowstride (il numero dibytes tra l’inizio di una riga e
l’inizio della successiva).

Ne consegue che le properties relative alla classe GdkPixbuf.Pixbuf sono:

Name Type Flags Short Description bits-per-sample int r/w/co/en il numero di bit
per sample colorspace GdkPixbuf.Colorspace r/w/co/en Il colorspace nel quale i
samples sono interpretati has-alpha bool r/w/co/en Se il pixbuf ha un canale
alpha height int r/w/co/en il numero di righe del pixbuf n-channels int
r/w/co/en Il numero di samples per pixel pixel-bytes GLib.Bytes r/w/co/en I dati
del pixel ReadOnly pixels int r/w/co/en I pixel data del pixbuf rowstride int
r/w/co/en I bytes tra l’inizio di una riga e l’inizio della successiva width int
r/w/co/en Il numero di colonne del pixbuf

Metodi

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

calculate_rowstride(colorspace, has_alpha, bits_per_sample, width, height)

Calcola il rowstride che un’immagine creata con i parametri passati come
argomenti dovrebbe avere.
Parametri:
colorspace: il GdkPixbuf.Colorspace per l’immagine;
has_alpha: un boolean per avere informazioni sulla trasparenza;
bits_per_sample: il numero di bit per color sample;
width: larghezza dell’immagine in pixels, deve essere > 0;
height: altezza dell’immagine in pixels, deve essere > 0;

get_file_info(filename)

Esegue il parsing di un file immagine e ritorna una tupla con il formato
dell’immagine come
oggetto GdkPixbuf.PixbufFormat e le dimensioni dell’immagine stessa.
Se il formato dell’immagine non viene riconosciuto viene ritornato None e lo
stesso discorso vale per le dimensioni:

1
2
3
4
5
6
7
8
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk
... from gi.repository import GdkPixbuf
>>> GdkPixbuf.Pixbuf.get_file_info("image.png")
(<GdkPixbuf.PixbufFormat object at 0x00000000040c6be0 (GdkPixbufFormat at
0x0000000004fa90c0)>, width=48, height=48)
>>> GdkPixbuf.Pixbuf.get_file_info("unknown.png")
(None, width=0, height=0)

Parametri:
filename: il nome del file da identificare;

get_file_info_async(filename, cancellable, callback, *user_data)

In modo asincrono esegue il parsing di un file immagine e ritorna una tupla
contenente il formato
e le dimensioni dell’immagine. Per maggiorni dettagli vedi
GdkPixbuf.Pixbuf.get_file_info(),
che è la versione sincrona di questo metodo.
Quando l’operazione è terminata la callback in argomento, verrà chiamata nel
thread principale.
A quel punto si chiamerà il metodo GdkPixbuf.Pixbuf.get_file_info_finish() per
avere il risultato.

Parametri:
filename: la stringa con il nome del file da identificare;
cancellable: un oggetto Gio.Cancellable opzionale o None;
callback: una callback Gio.AsyncReadyCallback da invocare quando
le informazioni dell’immagine sono disponibili, o None;
user_data: i dati opzionali da passare alla callback;

get_file_info_finish(async_result)

Termina un’operazione di parsing asincrona, iniziata con
GdkPixbuf.Pixbuf.get_file_info_async() e
ritorna un oggetto GdkPixbuf.PixbufFormat che descrive il formato dell’immagine
del file, o
None se il file non è stato riconosciuto.
Parametri:
async_result: un oggetto Gio.AsyncResult;

get_formats()

Ritorna la lista degli oggetti GdkPixbuf.PixbufFormat,
che rappresentano i formati supportati dal pixbuf.

1
2
3
4
5
6
7
8
9
10
>>> for format in GdkPixbuf.Pixbuf.get_formats():
...     print(format.get_description())   
...    
WMF
EMF
Windows animated cursor
BMP
GIF
MacOS X icon
...

init_modules(path)

Inizializza i moduli del loader di gdkpixbuf referenziati dal file loaders.cache
presente nella
directory.
Parametri:
path: la stringa col percorso della directory dove il file
loaders.cache è installato.

new(colorspace, has_alpha, bits_per_sample, width, height)

Crea un nuovo GdkPixbuf.Pixbuf e alloca un buffer per esso. Il buffer ha un
rowstride ottimale:

1
2
3
4
>>> pixbuf = GdkPixbuf.Pixbuf.new(colorspace=colorspace, has_alpha=True,
...                               bits_per_sample=8, width=48, height=48)
>>> pixbuf.get_rowstride()
192

Parametri:
colorspace: il GdkPixbuf.Colorspace per l’immagine;
has_alpha: un boolean per avere informazioni sulla trasparenza;
bits_per_sample: il numero di bit per color sample;
width: larghezza dell’immagine in pixels, deve essere > 0;
height: altezza dell’immagine in pixels, deve essere > 0;

new_from_bytes(data, colorspace, has_alpha, bits_per_sample, width, height,
rowstride)

Crea un nuovo GdkPixbuf.Pixbuf out of in-memory readonly image data.
Al momento sono supportate solo immagini RGB con 8 bits per sample.
Questa è la variante GLib.Bytes del metodo GdkPixbuf.Pixbuf.new_from_data().
Parametri:
data: i dati immagine in formato 8-bit/sample;
colorspace: il GdkPixbuf.Colorspace per l’immagine;
has_alpha: un boolean per avere informazioni sulla trasparenza;
bits_per_sample: il numero di bit per color sample;
width: larghezza dell’immagine in pixels, deve essere > 0;
height: altezza dell’immagine in pixels, deve essere > 0;
rowstride: distanza in bytes tra gli inizi riga;

new_from_data(data, colorspace, has_alpha, bits_per_sample, width, height,
rowstride, destroy_fn, *destroy_fn_data)

Crea un nuovo GdkPixbuf.Pixbuf out of in-memory image data.
Al momento sono supportate solo immagini RGB con 8 bits per sample.
Dal momento che forniamo un pixel buffer pre allocato, dobbiamo anche
specificare un modo per
liberare quei dati. Questo è ottenuto con una funzione
GdkPixbuf.PixbufDestroyNotify.
Quando un pixbuf è finalizzato la nostra “destroy notification function” viene
chiamata e sarà
incaricata di liberare i dati relativi ai pixel. Vedere anche
GdkPixbuf.Pixbuf.new_from_bytes().
Parametri:
data: i dati immagine in formato 8-bit/sample;
colorspace: il GdkPixbuf.Colorspace per l’immagine;
has_alpha: un boolean per avere informazioni sulla trasparenza;
bits_per_sample: il numero di bit per color sample;
width: larghezza dell’immagine in pixels, deve essere > 0;
height: altezza dell’immagine in pixels, deve essere > 0;
rowstride: distanza in bytes tra gli inizi riga;
destroy_fn: la funzione GdkPixbuf.PixbufDestroyNotify utilizzata
a pixbuf finalizzato, o None se non importa distruggere i dati;
destroy_fn_data: i dati da passare alla destroy notification
function;

new_from_file(filename)

Crea un nuovo pixbuf caricando l’immagine da un file. Il formato del file viene
riconosciuto
automaticamente. Se si dovessere verificare errori nell’operazione, verrà
ritornato None.
Parametri:
filename: la stringa con il nome del file da caricare;

new_from_file_at_scale(filename, width, height, preserve_aspect_ratio)

Crea un nuovo pixbuf caricando l’immagine da un file. Il formato del file viene
riconosciuto
automaticamente. Se si dovessere verificare errori nell’operazione, verrà
ritornato None.
L’immagine sarà scalata sulle dimensioni richieste, opzionalmente preservando
l’aspect ratio.
Quando preserviamo l’aspect ratio, con width=-1 scaliamo l’immagine sull’altezza
data,
con height=-1 scaliamo l’immagine sulla larghezza data.
Se non preserviamo l’aspect ratio, width=-1 o height=-1 significa non scalare
l’immagine su
quella dimensione.

1
2
3
4
5
6
7
8
9
10
11
>>> pixbuf = GdkPixbuf.Pixbuf.new_from_file("image.png")
>>> pixbuf.get_width()
48
>>> pixbuf.get_height()
48
>>> sc_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale("image.png", width=64,
height=82,
...                                                    
preserve_aspect_ratio=True)
>>> sc_pixbuf.get_width()
64
>>> sc_pixbuf.get_height()  # forced by aspect ratio
64

Parametri:
filename: la stringa con il nome del file da caricare;
width: la larghezza che l’immagine dovrà avere o -1 per non
forzare la dimensione;
height: : l’altezza che l’immagine dovrà avere o -1 per non
forzare la dimensione;
preserve_aspect_ratio il boolean che decide se preservare o meno
l’aspect ratio dell’immagine;

new_from_file_at_size(filename, width, height)

Crea un nuovo pixbuf caricando l’immagine da un file. Il formato del file viene
riconosciuto
automaticamente. Se si dovessere verificare errori nell’operazione, verrà
ritornato None.
L’immagine sarà scalata sulle dimensioni richieste, preservando però l’aspect
ratio,
potrebbe quindi capitare che il pixbuf risultante sia più piccolo rispetto a
larghezza e altezza
richieste, proprio a causa dell’aspect ratio.
Per rispettare in toto le dimensioni richieste senza tenere conto dell’aspect
ratio,
utilizzare il metodo GdkPixbuf.Pixbuf.new_from_file_at_scale().
Parametri:
filename: la stringa con il nome del file da caricare;
width: la larghezza che l’immagine dovrebbe avere;
height: l’altezza che l’immagine dovrebbe avere;

new_from_resource(resource_path)

Crea un nuovo pixbuf caricando un’immagine da una “resource”.
Il formato del file viene riconosciuto
automaticamente. Se si dovessere verificare errori nell’operazione, verrà
ritornato None.
Parametri:
resource_path: la stringa con il path della risorsa;

new_from_resource_at_scale(resource_path, width, height, preserve_aspect_ratio)

Crea un nuovo pixbuf caricando un’immagine da una “resource”.
Il formato del file viene riconosciuto automaticamente.
Se si dovessere verificare errori nell’operazione, verrà ritornato None.
L’immagine sarà scalata sulle dimensioni richieste, opzionalmente preservando
l’aspect ratio.
Quando preserviamo l’aspect ratio, con width=-1 scaliamo l’immagine sull’altezza
data,
con height=-1 scaliamo l’immagine sulla larghezza data.
Se non preserviamo l’aspect ratio, width=-1 o height=-1 significa non scalare
l’immagine su
quella dimensione.
Nota: Lo stream non viene chiuso da questo metodo.
Parametri:
resource_path: la stringa con il path della risorsa;
width: la larghezza che l’immagine dovrà avere o -1 per non
forzare la dimensione;
height: : l’altezza che l’immagine dovrà avere o -1 per non
forzare la dimensione;
preserve_aspect_ratio il boolean che decide se preservare o meno
l’aspect ratio dell’immagine;

new_from_stream(stream, cancellable)

Crea un nuovo pixbuf caricando un’immagine da uno stream in input.
Il formato del file viene riconosciuto automaticamente.
Se si dovessere verificare errori nell’operazione, verrà ritornato None.
Il cancellable può essere usato per abortire l’operazione da un altro thread.
Se l’operazione viene cancellata viene ritornato l’errore
Gio.IOErrorEnum.CANCELLED.
Nota: Lo stream non viene chiuso da questo metodo.
Parametri:
stream: un Gio.InputStream dal quale caricare il pixbuf;
cancellable: un Gio.Cancellable opzionale o None;

new_from_stream_async(stream, cancellable, callback, *user_data)

Crea un nuovo pixbuf in maniera asincrona, caricando un’immagine da uno stream
in input.
Per maggiori dettagli vedere GdkPixbuf.Pixbuf.new_from_stream(), che è la
versione sincrona del
metodo in oggetto. Quando l’operazione è terminata, una callback viene invocata
nel main thread.
E’ possibile quindi chiamare il metodo GdkPixbuf.Pixbuf.new_from_stream_finish()
per ottenere il
risultato di questa operazione.
Parametri:
stream: un Gio.InputStream dal quale caricare il pixbuf;
cancellable: un oggetto Gio.Cancellable opzionale o None;
callback: una callback Gio.AsyncReadyCallback da invocare quando
le informazioni dell’immagine sono disponibili, o None;
user_data: i dati opzionali da passare alla callback;

new_from_stream_at_scale(stream, width, height, preserve_aspect_ratio,
cancellable)

Crea un nuovo pixbuf caricando un’immagine da uno stream in input.
Il formato del file viene riconosciuto automaticamente.
Se si dovessere verificare errori nell’operazione, verrà ritornato None.
Il cancellable può essere usato per abortire l’operazione da un altro thread.
Se l’operazione viene cancellata viene ritornato l’errore
Gio.IOErrorEnum.CANCELLED.
L’immagine sarà scalata sulle dimensioni richieste, opzionalmente preservando
l’aspect ratio.
Quando preserviamo l’aspect ratio, con width=-1 scaliamo l’immagine sull’altezza
data,
con height=-1 scaliamo l’immagine sulla larghezza data.
Se non preserviamo l’aspect ratio, width=-1 o height=-1 significa non scalare
l’immagine su
quella dimensione.
Nota: Lo stream non viene chiuso da questo metodo.
Parametri:
stream: un Gio.InputStream dal quale caricare il pixbuf;
width: la larghezza che l’immagine dovrà avere o -1 per non
forzare la dimensione;
height: : l’altezza che l’immagine dovrà avere o -1 per non
forzare la dimensione;
preserve_aspect_ratio il boolean che decide se preservare o meno
l’aspect ratio dell’immagine;
cancellable: un oggetto Gio.Cancellable opzionale o None;

new_from_stream_at_scale_async(stream, width, height, preserve_aspect_ratio,
cancellable, callback, *user_data)

Crea un nuovo pixbuf in maniera asincrona, caricando un’immagine da uno stream
in input.
Per maggiori dettagli vedere GdkPixbuf.Pixbuf.new_from_stream_at_scale(), che è
la versione
sincrona del metodo in oggetto. Quando l’operazione è terminata, una callback
viene invocata nel
main thread. E’ possibile quindi chiamare il metodo
GdkPixbuf.Pixbuf.new_from_stream_finish() per
ottenere il risultato di questa operazione.
Parametri:
stream: un Gio.InputStream dal quale caricare il pixbuf;
width: la larghezza che l’immagine dovrà avere o -1 per non
forzare la dimensione;
height: : l’altezza che l’immagine dovrà avere o -1 per non
forzare la dimensione;
preserve_aspect_ratio il boolean che decide se preservare o meno
l’aspect ratio dell’immagine;
cancellable: un oggetto Gio.Cancellable opzionale o None;
callback (Gio.AsyncReadyCallback or None) – a Gio.AsyncReadyCallback to call
when the pixbuf is loaded
user_data (object or None) – the data to pass to the callback function
callback: una callback Gio.AsyncReadyCallback da invocare quando
le informazioni dell’immagine sono disponibili, o None;
user_data: i dati opzionali da passare alla callback;

new_from_stream_finish(async_result)

Termina un’operazione asincrona di creazione di un pixbuf iniziata con il metodo
GdkPixbuf.Pixbuf.new_from_stream_async().
Parametri:
async_result: un oggetto Gio.AsyncResult;

new_from_xpm_data(data)

Crea un nuovo pixbuf analizzando i dati XPM in memoria.
Questi dati sono comunemente il risultato dell’inclusione di un file XPM in una
sorgente C.
Parametri:
data: i dati XPM inline;

save_to_stream_finish(async_result)

Termina un’operazione asincrona di salvataggio pixbuf.
Parametri:
async_result: un oggetto Gio.AsyncResult;

add_alpha(substitute_color, r, g, b)

Prende un pixbuf esistente e aggiunge un canale alpha (trasparenza) ad esso.
Se il pixbuf ha già un canale alpha, i valori del canale sono copiati
dall’originale,
altrimenti il canale alpha viene inizializzato a 255 (opacità piena).
Se substitute_color è True, allora ai colori specificati da “r”, “g”, “b”, sarà
assegnata opacità zero. Esempio, se passiamo (255, 255, 255) per il substitute
color,
tutti i pixel bianchi diventeranno completamente trasparenti.
Parametri:
substitute_color: boolean per settare un colore a opacità zero;
Se falso, gli argomenti r, g, b vengono ignorati.
r: il valore Red da sostituire;
g: il valore Green da sostituire;
b: il valore Blue da sostituire;

apply_embedded_orientation()

Prende un pixbuf esistente e controlla che sia presente un’opzione/tag
“orientation”associato,
il quale può essere fornito dal loader jpeg (che legge il teg “exif
orientation”), o dal loader
tiff (che legge il tag tiff orientation e lo compensa per le trasformazioni
eseguite da libtiff).
Se è presente un’opzione/tag “orientation”, verrà eseguita l’appropriata
trasformazione, così
da orientare il pixbuf correttamente. Verrà quindi ritornato il nuovo Pixbuf o
None.

composite(dest, dest_x, dest_y, dest_width, dest_height, offset_x, offset_y,
scale_x, scale_y, interp_type, overall_alpha)

Crea una trasformazione del pixbuf scalandolo secondo “scale_x” e “scale_y” e
traslandolo secondo
gli offset “offset_x” e “offset_y”. Questo da un’immagine nelle coordinate del
pixbuf di
destinazione. Il rettangolo (dest_x, dest_y, dest_width, dest_height) è quindi
“alpha blended” sul
rettangolo corrispondente dell’immagine di destinazione originale.
Quando il rettangolo di destinazione contiene parti non presenti nell’immagine
sorgente,
i dati ai bordi dell’immagine sorgente vengono replicati all’infinito.
Vedere Alpha compositing/blending

Parametri:
dest: il GdkPixbuf.Pixbuf nel quale fare il render del risultato;
dest_x: la coord. X (sx) della regione su cui fare il render;
dest_y: la coord. Y (top) della regione su cui fare il render;
dest_width: la larghezza della regione su cui fare il render;
dest_height: l’altezza della regione su cui fare il render;
offset_x: l’offset (float) in direzione X;
offset_y: l’offset (float) in direzione Y;
scale_x: il fattore di scala (float) in direzione X;
scale_y: il fattore di scala (float) in direzione Y;
interp_type: l’interpolazione GdkPixbuf.InterpType per la trasf.;
overall_alpha: l’alpha totale per l’immagine sorgente (0-255);

composite_color(dest, dest_x, dest_y, dest_width, dest_height, offset_x,
offset_y, scale_x, scale_y, interp_type, overall_alpha, check_x, check_y,
check_size, color1, color2)

Crea una trasformazione del pixbuf scalandola secondo “scale_x” e “scale_y” e
traslandolo secondo
gli offset “offset_x” e “offset_y”, quindi esegue l’alpha blending del
risultato, sul rettangolo
di destinazione (“dest_x”, “dest_y”, “dest_width”, “dest_height”) con un
checkboard dei colori
“color1” e “color2” ed esegue il render sull’immagine di destinazione.
Se l’immagine di sorgente non ha un alpha channel, e overall_alpha=255, viene
usata una
scorciatoia omettendo l’alpha blending ed eseguendo solo la scalatura
dell’immagine.
Parametri:
dest: il GdkPixbuf.Pixbuf nel quale fare il render del risultato;
dest_x: la coord. X (sx) della regione su cui fare il render;
dest_y: la coord. Y (top) della regione su cui fare il render;
dest_width: la larghezza della regione su cui fare il render;
dest_height: l’altezza della regione su cui fare il render;
offset_x: l’offset (float) in direzione X;
offset_y: l’offset (float) in direzione Y;
scale_x: il fattore di scala (float) in direzione X;
scale_y: il fattore di scala (float) in direzione Y;
interp_type: l’interpolazione GdkPixbuf.InterpType per la trasf.;
overall_alpha: l’alpha totale per l’immagine sorgente (0-255);
check_x: l’offset X del checkboard;
check_y: l’offset Y del checkboard;
check_size: il size dei controlli nel checkboard (potenza di 2)
color1: il colore del check al superiore sinistro (checkboard);
color2: il colore dell’altro check;

Vedere GdkPixbuf.Pixbuf.composite_color_simple() per una variante più semplice
di questo metodo.

composite_color_simple(dest_width, dest_height, interp_type, overall_alpha,
check_size, color1, color2)

Crea un nuovo GdkPixbuf.Pixbuf scalandolo con “dest_width x dest_height” ed
eseguendo l’alpha
blending del risultato con un checkboard di colori “color1” e “color2”.
Parametri:
dest_width: la larghezza dell’immagine di destinazione;
dest_height: l’altezza dell’immagine di destinazione;
interp_type: l’interpolazione GdkPixbuf.InterpType per la trasf.;
overall_alpha: l’alpha totale per l’immagine sorgente (0-255);
check_size: il size dei controlli nel checkboard (potenza di 2)
color1: il colore del check al superiore sinistro (checkboard);
color2: il colore dell’altro check;

copy()

Crea un nuovo GdkPixbuf.Pixbuf con una copia delle informazioni presenti nel
pixbuf.
Questo non copia le opzioni settate nel pixbuf originali, per eseguire una copia
completa usare
il metodo GdkPixbuf.Pixbuf.copy_options().

copy_area(src_x, src_y, width, height, dest_pixbuf, dest_x, dest_y)

Copia un’area rettangolare dal pixbuf, al “dest_pixbuf”. La conversione del
formato, avviene in
maniera automatica. Se il rettangolo sorgente si sovrappone al rettangolo di
destinazione sullo
stesso pixbuf, sarà sovrascritto durante la copia, perciò non possiamo usare
questo metodo per
fare lo scroll di un pixbuf.
Parametri:
src_x: La coord. X del rettangolo sorgente;
src_y: La coord. Y del rettangolo sorgente;
width: La larghezza dell’area da copiare;
height: L’altezza dell’area da copiare;
dest_pixbuf: il GdkPixbuf.Pixbuf di destinazione;
dest_x: La coord. X del pixbuf di destinazione;
dest_y: La coord. Y del pixbuf di destinazione;

copy_options(dest_pixbuf)

Copia le coppie key/value relative alle opzioni di un GdkPixbuf.Pixbuf, in un
altro.
Questo è comodo per mantenere i metadata originali dopo aver modificato un file.
Comunque fare attenzione a rimuovere i metadata che abbiamo già applicato, come
ad esempio
l’opzione “orientation” dopo la rotazione dell’immagine.
Parametri:
dest_pixbuf: il GdkPixbuf.Pixbuf su cui copiare le opzioni;

fill(pixel)

Cancella un pixbuf al valore RGBA dato, convertendo il valore RGBA nel formato
pixel del pixbuf.
Il valore alpha sarà ignorato se il pixbuf non ha un alpha channel.
Parametri:
pixel: il pixel RGBA da cancellare (0xffffffff è bianco opaco,
mentre 0x00000000 è nero trasparente)

flip(horizontal)

Capovolge un pixbuf orizzontalmente o verticalmente e ritorna il pixbuf
risultante.
Parametri:
horizontal: il boolean che settato a True
capovolge il pixbuf orizzontalmente, mentre a False, verticalmente;

get_bits_per_sample()

Ritorna il numero di bits per color sample nel pixbuf.

get_byte_length()

Ritorna la lunghezza in bytes dei pixel data.

get_colorspace()

Ritorna il GdkPixbuf.Colorspace del pixbuf.

get_has_alpha()

Ritorna True se il pixbuf ha un alpha channel, altrimenti False.
L’alpha channel è l’informazione relativa all’opacità del pixbuf.

get_height()

Ritorna l’altezza del pixbuf espressa in pixels.

get_n_channels()

Ritorna il numero di canali di un pixbuf.

get_option(key)

Cerca la chiave nel dizionario i opzioni che sono state associate al pixbuf
quando questo è stato
caricato o che potrebbe essere stata settata in seguito con
GdkPixbuf.Pixbuf.set_option().
Alcuni esempi:
Il loader ANI fornisce le opzioni “Title” e “Artist”.
I loaders ICO, XBM, e XPM forniscono le opzioni hot-spot “x_hot” e “y_hot” per
la definizione del
cursore. Il loader PNG fornisce, come opzioni, le coppie chiave/valore
tEXt-ancillary-chunk.
I loaders TIFF e JPEG ritornano un’opzione “orientation” corrispondente al tag
“orientation”
TIFF/Exif (se presente).
Il loader TIFF setta l’opzione “multipage” a “yes” quando un TIFF multi-page
viene caricato.
I loaders JPEG e PNG settano le opzioni “x-dpi” e “y-dpi” se il file contiene
informazioni
sulla densitò di immagine in punti per pollice.
Il loader JPEG setta l’opzione “comment” con il tag EXIF.
Parametri:
key: la stringa con la quale della quale chiediamo il valore;

get_options()

Ritorna un dizionario GLib.HashTable di chiavi/valori contenente le opzioni che
possono essere
state settate, quando il pixbuf è stato caricato o che potrebbero essere state
aggiunte in seguito
con GdkPixbuf.Pixbuf.set_option().
Vedere GdkPixbuf.Pixbuf.get_option() per maggiori dettagli.

get_pixels()

Ritorna i pixel data di un pixbuf.

1
2
>>> pixbuf.get_pixels()
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0...

get_rowstride()

Ritorna il rowrowstride del pixbuf, ovvero la distanza, in bytes, tra l’inizio
di una riga e
l’inizio della riga successiva.

1
2
3
4
5
6
>>> pixbuf.get_rowstride()
192
>>> len(pixbuf.get_pixels())/pixbuf.get_rowstride()
48.0
>>> pixbuf.get_height()
48

get_width()

Ritorna la larghezza in pixels di un pixbuf.

new_subpixbuf(src_x, src_y, width, height)

Crea un nuovo pixbuf che rappresenta una “sottoregione” del pixbuf in oggetto.
Il nuovo pixbuf condivide i propri pixels con il pixbuf originale, così facendo
la scrittura
di un bixbuf ha effetto su entrambi.
Il nuovo pixbuf mantiene un riferimento sul pixbuf di partenza, così il pixbuf
in oggetto non
verrà finalizzato fino a che il nuovo pixbuf non lo sarà.
Se il pixbuf di partenza è in sola lettura, questo metodo lo forzerà in
scrittura.
Parametri:
src_x: la coordinata X del pixbuf sorgente;
src_y: la coordinata Y del pixbuf sorgente;
width: la larghezza della regione nel pixbuf;
height: l’altezza della regione nel pixbuf;

read_pixel_bytes()

Ritorna un oggetto GLib.Bytes contenente i dati raw del pixel.
Questi dati non devono essere modificati.
Questo metodo permette di saltare la copia implicita che deve essere fatta se il
metodo
GdkPixbuf.Pixbuf.get_pixels() viene chiamato su un pixbuf read-only.

1
2
>>> pixbuf.read_pixel_bytes()
<GLib.Bytes object at 0x000000000396f5e0 (GBytes at 0x0000000004a45960)>

read_pixels()

Ritorna il raw pixel data.
Questi dati non devono essere modificati.
Questo metodo permette di saltare la copia implicita che deve essere fatta se il
metodo
GdkPixbuf.Pixbuf.get_pixels() viene chiamato su un pixbuf read-only.

1
2
>>> pixbuf.read_pixels()
32

remove_option(key)

Rimuove l’opzione (key) dal dizionario delle opzioni/valori creata quando il
pixbuf è stato
caricato. Ritorna True se l’eliminazione va a buon fine.

Parametri:
key: la stringa con il nome dell’opzione (key) da rimuovere;

rotate_simple(angle)

Ruota il pixbuf di un multiplo di 90 gradi e ritorna il risultato in un nuovo
pixbuf.
Se l’angolo è 0, viene ritornata una copia del pixbuf senza rotazione.
Parametri:
angle: il GdkPixbuf.PixbufRotation, cioè quanto ruotare il pixbuf;

saturate_and_pixelate(dest, saturation, pixelate)

Modifica la saturazione e opzionalmente esegue la pixelatura del pixbuf,
mettendo il risultato
dell’operazione nel pixbuf di destinazione.
Se la saturation=1.0 la saturazione non viene modificata.
Con valori minori di 1.0, la saturazione viene ridotta (l’immagine si trasforma
in scala di
grigio); se saturation è maggiore di 1.0, la saturazione viene incrementata
(l’immagine assume
colori più vividi). Se pixelate=True, allora i pixels vengono sbiaditi in un
pattern
“checkerboard” per creare un’immagine pixelata.
Il pixbuf sorgente e di destinazione devono avere lo stesso formato, dimensione
e rowstride.
Parametri:
dest: il GdkPixbuf.Pixbuf su cui piazzare il pixbuf modificato;
saturation: il fattore di saturazione (float);
pixelate: il boolean per pixelare o meno il pixbuf risultante;

save_to_bufferv(type, option_keys, option_values)

Salva il pixbuf in un nuovo buffer nel tipo di formato “jpeg”, “tiff”, “png”,
“ico” o “bmp”.
Parametri:
type: stringa con il nome del formato file;
option_keys: una di chiavi corrispondenti alla opzioni da settare;
option_values: una lista di valori corrispondenti alle opzioni;

save_to_callbackv(save_func, user_data, type, option_keys, option_values)

Salva il pixbuf in una callback nel tipo di formato “jpeg”, “png”, “tiff”, “ico”
o “bmp”.
Se si verifica un errore, viene ritornato False.
Parametri:
save_func: un oggetto GdkPixbuf.PixbufSaveFunc, ovvero una
funzione chiamata per salvare ogni blocco di dati generata dalla routine di
salvataggio;
user_data: i dati da passare alla funzione;
type: stringa con il nome del formato file;
option_keys: una di chiavi corrispondenti alla opzioni da settare;
option_values: una lista di valori corrispondenti alle opzioni;

save_to_streamv(stream, type, option_keys, option_values, cancellable)

Salva il pixbuf in uno stream di output. I formati di file supportati sono
“jpeg”, “tiff”, “png”,
“ico” or “bmp”. Se il pixbuf viene salvato correttamente, il metodo ritorna
True,
altrimenti False.
Parametri:
stream: un Gio.OutputStream su cui salvare il pixbuf;
type: stringa con il nome del formato file;
option_keys: una di chiavi corrispondenti alla opzioni da settare;
option_values: una lista di valori corrispondenti alle opzioni;
cancellable: un Gio.Cancellable opzionale o None;

save_to_streamv_async(stream, type, option_keys, option_values, cancellable,
callback, *user_data)

Salva il pixbuf in uno stream di output in modo asincrono.
Per maggiori dettagli, vedere GdkPixbuf.Pixbuf.save_to_streamv(), che è la
versione sincrona del
metodo in oggetto. Quando l’operazione è terminata la callback sarà chiamata nel
thread
principale e quindi possiamo chiamare GdkPixbuf.Pixbuf.save_to_stream_finish()
per ottenere il
risultato dell’operazione.
Parametri:
stream: un Gio.OutputStream su cui salvare il pixbuf;
type: stringa con il nome del formato file;
option_keys: una di chiavi corrispondenti alla opzioni da settare;
option_values: una lista di valori corrispondenti alle opzioni;
cancellable: un Gio.Cancellable opzionale o None;
callback: un Gio.AsyncReadyCallback da invocare quandi il pixbuf
viene salvato;
user_data: i dati da passare alla callback;

savev(filename, type, option_keys, option_values)

Salva il pixbuf in un file di tipo “jpeg”, “png”, “tiff”, “ico” or “bmp”.
Se il pixbuf viene salvato correttamente, il metodo ritorna True, altrimenti
False.
Parametri:
filename:la stringa con il nome del file da salvare;
type: stringa con il nome del formato file;
option_keys: una di chiavi corrispondenti alla opzioni da settare;
option_values: una lista di valori corrispondenti alle opzioni;

scale(dest, dest_x, dest_y, dest_width, dest_height, offset_x, offset_y,
scale_x, scale_y, interp_type)

Trasforma l’immagine sorgente scalandola su “scale_x” e “scale_y” e imposta
l’offset definito da
“offset_x” e “offset_y”, quindi rappresenta il rettangolo (dest_x, dest_y,
dest_width,
dest_height) dell’immagine risultante, sull’immagine di destinazione,
rimpiazzando i contenuti
precedenti. Se non ci sono esigenze particolari si consiglia l’utilizzo del
metodo
GdkPixbuf.Pixbuf.scale_simple().
Se il rettangolo del sorgente si sovrappone al rettangolo di destinazione sullo
stesso pixbuf,
sarà sovrascritto durante la scalatura generando dei “rendering artifacts”.
Parametri:
dest: il GdkPixbuf.Pixbuf nel quale fare il render del risultato;
dest_x: la coord. X (sx) della regione su cui fare il render;
dest_y: la coord. Y (top) della regione su cui fare il render;
dest_width: la larghezza della regione su cui fare il render;
dest_height: l’altezza della regione su cui fare il render;
offset_x: l’offset (float) in direzione X;
offset_y: l’offset (float) in direzione Y;
scale_x: il fattore di scala (float) in direzione X;
scale_y: il fattore di scala (float) in direzione Y;
interp_type: l’interpolazione GdkPixbuf.InterpType per la trasf.;

scale_simple(dest_width, dest_height, interp_type)

Crea un nuovo GdkPixbuf.Pixbuf contenente una copia del pixbuf scalato a
dest_width x dest_height.
Non influenza il pixbuf di origine. Per avere la massima velocità
nell’operazione, il valore del
tipo di interpolazione deve essere settato a GdkPixbuf.InterpType.NEAREST.
(ma nelle operazioni if you want maximum speed
(but nelle operazioni di ridimensionamento è molto poco efficiente).
Il tipo di interpolazione di default dovrebbe essere
GdkPixbuf.InterpType.BILINEAR, che offre
un rapporto qualità/velocità ragionevole.
Possiamo scalare una porzione di pixbuf, creando un sub-pixbuf
(GdkPixbuf.Pixbuf.new_subpixbuf()).
Se “dest_width” e “dest_height” sono uguali alla larghezza e altezza del pixbuf
di origine,
viene ritornata una copia del pixbuf di origine stesso, evitando la scalatura.
Per scalature e alpha-blending più complicati, consultare rispettivamente i
metodi
GdkPixbuf.Pixbuf.scale() e GdkPixbuf.Pixbuf.composite().
Parametri:
dest_width: la larghezza dell’immagine di destinazione;
dest_height: l’altezza dell’immagine di destinazione;
interp_type: il tipo di interpolazione (GdkPixbuf.InterpType);

set_option(key, value)

Associa un’opzione in forma chiave/valore al GdkPixbuf.Pixbuf.
Se la chiave esiste già nel dizionario delle opzioni, il nuovo valore viene
ignorato ed il metodo
ritorna False.
Parametri:
key: l’opzione (chiave del dizionario) da associare al pixbuf;
value: il valore dell’opzione;

Di seguito un codice di esempio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GdkPixbuf
 
 
class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Pixbuf example")
        self.set_default_size(300, 150)
        box = Gtk.Box(spacing=6)
        box.set_homogeneous(True)
        pixbuf = GdkPixbuf.Pixbuf.new_from_file("image.png")
        image = Gtk.Image.new_from_pixbuf(pixbuf)
        pixbuf2 = pixbuf.rotate_simple(90)
        pixbuf2.saturate_and_pixelate(pixbuf2, 3.0, True)
        image2 = Gtk.Image.new_from_pixbuf(pixbuf2)
        s_height = pixbuf.get_height() * 2
        s_width = pixbuf.get_width() * 2
        pixbuf3 = pixbuf.scale_simple(dest_width=s_width, dest_height=s_height,
                                      interp_type=GdkPixbuf.InterpType.BILINEAR)
        image3 = Gtk.Image.new_from_pixbuf(pixbuf3)
        box.pack_start(image, True, True, 0)
        box.pack_start(image2, True, True, 0)
        box.pack_start(image3, True, True, 0)
        self.add(box)
 
 
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 Pixbuf


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python


PYGOBJECT: GIO.SIMPLEACTION

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

SimpleAction

Una Gio.SimpleAction, come indica il nome, è una semplice implementazione
dell’interfaccia di
Gio.Action, quindi rappresenta il modo più semplice per creare una Action.
La principale interfaccia di una Action è che può essere attivata con
Gio.Action.activate().
Tale metodo causa l’emissione del segnale “activate”.
Una Action può opzionalmente avere uno stato, che può essere settato utilizzando
il metodo
Gio.Action.change_state().
La classe Gio.Action è responsabile della memorizzazione del nome dell’azione,
del tipo di
parametro, dello stato opzionale e dell’emissione del segnale appropriato quando
lo stato cambia.
L’utilizzo delle Actions è un modo per associare un particolare attività ad un
nome, tale attività
verrà eseguita dall’applicazione o da un widget, semplicemente facendo
riferimento a tale nome.
In questo modo si possono tenere separate la logica dell’azione, dalla UI.
Un tipico esempio di utilizzo di Actions è dato dai Menu.

Le properties principali sono quelle ereditate da Gio.Action:

Name Type Flags Short Description enabled bool r Se la Action può essere
attivata name str r Il nome usato per invocare la Action parameter-type
GLib.VariantType r Il tipo di GLib.Variant passato al metodo activate() state
GLib.Variant r Lo stato in cui si trova la Action state-type GLib.VariantType r
Il tipo di stato tenuto dalla Action

Segnali

I segnale relativi al Gio.SimpleAction sono:

Name Short Description activate Indica che la Action è stata appena attivata
change-state Indica che la Action ha appena ricevuto una richiesta di cambiare
il proprio stato

Il segnale activate si aspetta due parametri, simple_action” e “parameter”.
Basterà connettere la action al segnale “activate” con un handler che tenga
presente di questi
parametri:

1
2
3
4
5
6
7
8
9
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk
... from gi.repository import Gio
>>> action = Gio.SimpleAction.new(name='Bancaldo', parameter_type=None)
action.connect("activate", lambda a, p: print("INFO: action '%s' activated!" %
a.get_name()))
8
>>> action.activate()
INFO: action 'Bancaldo' activated!

Il segnale change-state si aspetta due parametri, simple_action” e “value”.
Basterà connettere la action al segnale “activate” con un handler che tenga
presente di questi
parametri:

1
2
3
4
5
6
7
8
9
10
11
>>> variant = GLib.Variant.new_boolean(True)
>>> stateful_action = Gio.SimpleAction.new_stateful(name="BancaldoStateful",
...                                                 parameter_type=None,
...                                                 state=variant)
>>> stateful_action.connect("change-state", lambda a, v: print("INFO: '%s' state
changed to %s!" %
                                                               (a.get_name(),
v)))
10
>>> stateful_action.change_state(GLib.Variant.new_boolean(True))
INFO: 'BancaldoStateful' state changed to true!
>>> stateful_action.change_state(GLib.Variant.new_boolean(False))
INFO: 'BancaldoStateful' state changed to false!

Metodi

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

new(name, parameter_type)

Crea una nuova Action stateless.
Per creare una Action che abbia uno stato, utilizzare il metodo
Gio.SimpleAction.new_stateful().

1
2
3
4
>>> action = Gio.SimpleAction.new(name='Bancaldo', parameter_type=None)
>>> action.get_state()
 
>>>

Parametri:
name: il nome della Action;
parameter_type: il tipo di parametro (GLib.VariantType o None) che
sarà passato agli handlers del segnale “activate” dell’oggetto Gio.SimpleAction,
o None
per none passare nessun parametro;

new_stateful(name, parameter_type, state)

Crea una nuova stateful Action.
Ovviamente tutti i futuri valori di “state”, devono essere dello stesso
GLib.Variant definito
in fase di costruzione.

1
2
3
4
5
6
7
>>> from gi.repository import GLib
>>> variant = GLib.Variant.new_boolean(True)
>>> stateful_action = Gio.SimpleAction.new_stateful(name="BancaldoStateful",
...                                                 parameter_type=None,
...                                                 state=variant)
>>> stateful_action.get_state()
GLib.Variant('b', true)

Parametri:
name: il nome della Action;
parameter_type: il tipo di parametro (GLib.VariantType o None) che
sarà passato agli handlers del segnale “activate” dell’oggetto Gio.SimpleAction,
o None
per none passare nessun parametro;
state: lo stato iniziale (GLib.Variant) della Action;

set_enabled(enabled)

Abilita o disabilita una Action. Ovviamente una Action deve essere abilitata per
poter essere
attivata o cambiare il proprio stato dall’esterno.
Parametri:
enabled: il boolean che abilita/disabilita la Action;

set_state(value)

Setta lo stato della Action. Questo metodo aggiorna direttamente la property
“state”.
Non dovrebbe essere chiamato dall’utente per modificare lo stato della Action; è
preferibile utilizzare il metodo Gio.Action.change_state().

1
2
3
4
>>> new_state = GLib.Variant.new_boolean(False)
>>> stateful_action.set_state(new_state)
>>> stateful_action.get_state()
GLib.Variant('b', false)

Parametri:
value: il nuovo GLib.Variant con cui modificheremo lo stato;

set_state_hint(state_hint)

Setta l’hint (suggerimento) dello stato, per la Action.

Parametri:
state_hint: il GLib.Variant (o None) che rappresenta lo state hint
della Action.

1
2
3
4
>>> state_hint = GLib.Variant.new_string("Bancaldo's Boolean")
>>> stateful_action.set_state_hint(state_hint)
>>> stateful_action.get_state_hint()
GLib.Variant('s', "Bancaldo's Boolean")

Ecco un codice di esempio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/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()

link di riferimento:

torna all’indice degli appunti
Gtk3 Gio.Action
GLib.Variant
GLib.VariantType


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python


PYGOBJECT: GIO.ACTIONMAP

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

ActionMap

L’interfaccia Gio.ActionMap è implementata da Gio.ActionGroup.
Ha la funzione di contenere istanze di Gio.Action.
Un’applicazione comune di questa interfaccia è quella di mappare le actions
provenienti da vari
gruppi (come Gtk.Application e Gtk.ApplicationWindow) utilizzando nomi con
prefissi
identificativi, come ad esempio “app.” e “win.
Attenzione! Gio.ActionMap e Gio.ActionGroup sono Interfacce e non classi con un
metodo costruttore. Non è pertanto possibile costruirne delle istanze
direttamente.

1
2
3
4
5
6
7
8
9
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk
... from gi.repository import Gio
...
>>> action_map = Gio.ActionMap()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NotImplementedError: ActionMap can not be constructed

E’ quindi necessario utilizzare delle classi che, oltre ad implementare la
stessa interfaccia,
mettano a disposizione i metodi costruttori necessari allo scopo:

1
2
3
>>> myapp = Gtk.ApplicationWindow()
>>> action = Gio.SimpleAction.new(name='Bancaldo', parameter_type=None)
>>> myapp.add_action(action)

Non ci sono properties per Gio.ActionMap.

Segnali

Non ci sono segnali per Gio.ActionMap.

Metodi

I principali metodi sono:

add_action(action)

Aggiunge una action all’ActionMap. Se l’ActionMap contiene già una action con lo
stesso nome,
la vecchia action viene rimossa dell’ActionMap stesso.
Parametri:
action: l’oggetto Gio.Action da aggiungere al Gio.ActionMap;

add_action_entries(entries, user_data)

Questo è un metodo che permette di aggiungere ad un Gio.ActionMap, una lista di
Gio.ActionEntry.
Parametri:
entries: la lista di Gio.ActionEntry da agiungere all’ActionMap;
user_data: i dati per le connessioni ai segnali;

lookup_action(action_name)

Ritorna la action con il nome passato come argomento, o None se non ci sono
corrispondenze.

1
2
3
4
5
>>> myapp.lookup_action("Bancaldo")
>>> action = Gio.SimpleAction.new(name='Bancaldo', parameter_type=None)
>>> myapp.add_action(action)
>>> myapp.lookup_action("Bancaldo")
<Gio.SimpleAction object at 0x000000000365bfc0 (GSimpleAction at
0x0000000004b049c0)>

Parametri:
action_name: il nome della action;

remove_action(action_name)

Rimuove la action con il nome passato come argomento, dall’ActionMap.
Parametri:
action_name: il nome della action che vogliamo rimuovere;

– I metodi ereditati da Gio.ActionGroup sono:

action_added(action_name)

Emette il segnale “action-added” di Gio.ActionGroup.
Parametri:
action_name: il nome della action nel gruppo;

action_enabled_changed(action_name, enabled)

Emette il segnale “action-enabled-changed” di Gio.ActionGroup.
Parametri:
action_name: il nome della action nel gruppo;
enabled: il boolean che abilita/disabilita la action;

action_removed(action_name)

Emette il segnale “action-removed” di Gio.ActionGroup.
Parametri:
action_name: il nome della action nel gruppo;

action_state_changed(action_name, state)

Emette il segnale “action-state-changed” di Gio.ActionGroup.
Parametri:
action_name: il nome della action nel gruppo;
state: il nuovo stato GLib.Variant della action;

activate_action(action_name, parameter)

Attiva la action all’interno del gruppo. Se la action si aspetta un parametro,
viene passato
il tipo corretto di parametro richiesto, altrimenti None.
Vedere Gio.ActionGroup.get_action_parameter_type().
Parametri:
action_name: il nome della action nel gruppo;
parameter: i parametri GLib.Variant all’attivazione (o None);

change_action_state(action_name, value)

Cambia lo stato della action con il valore passato come argomento.
La action deve essere stateful e il valore deve essere del tipo corretto.
Vedere Gio.ActionGroup.get_action_state_type().
Parametri:
action_name: il nome della action nel gruppo;
value: il nuovo stato GLib.Variant

get_action_enabled(action_name)

Controlla se la action all’interno del gruppo, è abilitata.
Una action per essere attivata o per poter cambiare il proprio stato, deve
essere abilitata.
Parametri:
action_name: il nome della action nel gruppo;

get_action_parameter_type(action_name)

Ritorna il tipo di parametro che deve essere fornito quando si attiva la action.
Quando si attiva una action usando il metodo Gio.ActionGroup.activate_action(),
il GLib.Variant
passato a questo metodo deve essere lo stesso tipo ritornato dal metodo in
oggetto, se invece
questo metodo ritorna None, allora None dovrà essere passato a
Gio.ActionGroup.activate_action().
Parametri:
action_name: il nome della action nel gruppo;

get_action_state(action_name)

Ritorna lo stato corrente della action con il nome passato come argomento.
Se la action non è stateful allora verrà ritornato None.
Se la action è stateful allora verrà ritornato il tipo di valore che
corrisponderà al tipo
ritornato dal metodo Gio.ActionGroup.get_action_state_type().
Parametri:
action_name: il nome della action nel gruppo;

get_action_state_hint(action_name)

Ritorna un hint (suggerimento) sul range valido di valori per lo stato della
action.
Se la action non è stateful o non è stato settato alcun hint, allora verrà
ritornato None.
Se viene ritornata una lista di GLib.Variant, allora ogni elemento della lista
sarà un possibile
valore dello stato della action.
Se viene ritornata una coppia di GLib.Variant (tupla) allora la tupla
specificherà i valori
minimo e massimo dello stato.
Parametri:
action_name: il nome della action nel gruppo;

get_action_state_type(action_name)

Ritorna il tipo di stato della action.
Se la action è stateful, il metodo ritorna il GLib.VariantType dello stato della
action e tutte le
chiamate al metodo Gio.ActionGroup.change_action_state() devono avere un
GLib.Variant di
questo tipo e Gio.ActionGroup.get_action_state() ritornerà ovviamento lo stesso
tipo di
GLib.Variant. Se la action non è stateful verrà ritornato None.
Parametri:
action_name: il nome della action nel gruppo;

has_action(action_name)

Controlla se la action esiste all’interno dell’ActionGroup.
Parametri:
action_name: il nome della action nel gruppo;

list_actions()

Lista le actions presenti nell’ActionGroup.

query_action(action_name)

Ritorna una ResultTuple con tutti i parametri della action con nome passato come
argomento.
Questo metodo acquisisce tutte le informazioni disponibili da
Gio.ActionGroup.has_action(),
Gio.ActionGroup.get_action_enabled(),
Gio.ActionGroup.get_action_parameter_type(),
Gio.ActionGroup.get_action_state_type(), Gio.ActionGroup.get_action_state_hint()
e
Gio.ActionGroup.get_action_state() con una singola chiamata.
Se la action esiste, viene ritornato True e tutti i valori diversi da None.
Se la action non esiste, viene ritornato False.

1
2
>>> myapp.query_action("Bancaldo")
(True, enabled=True, parameter_type=None, state_type=None, state_hint=None,
state=None)

Parametri:
action_name: il nome della action nel gruppo;

link di riferimento:

torna all’indice degli appunti
Gtk3 Gio.ActionMap
Gtk3 Gio.ActionGroup


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python


PYGOBJECT: GTK.EVENTBOX

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

EventBox

Un widget Gtk.EventBox è una sottoclasse di Gtk.Bin che possiede una propria
Window.
Viene spesso utilizzato quando vogliamo catturare gli eventi per quei widget che
non possiedono
una propria finestra, come ad esempio le Immagini.

Le properties principali sono:

Name Type Flags Short Description above-child bool r/w/en Se la finestra della
eventbox, si trova sopra la finestra del widget figlio, invece che sotto di essa
visible-window bool r/w/en Se la event box è visibile, anzichè invisibile ed
usata solo per intercettare gli eventi

Segnali

I segnali sono quelli ereditati da Gtk.Container, Gtk.Widget e GObject.Object.

Metodi

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

new()

Crea un nuovo widget Gtk.EventBox.

1
2
3
4
5
6
7
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk
...
>>> image = Gtk.Image.new_from_file("image.png")
>>> eventbox = Gtk.EventBox.new()
>>> eventbox.add(image)

get_above_child()

Ritorna True se la finestra della eventbox è sopra alla window del proprio
child,
altrimenti ritorna False, se si trova sotto.
Vedere Gtk.EventBox.set_above_child() per i dettagli.

get_visible_window()

Ritorna True se la finestra della eventbox è visibile, altrimenti False
Vedere Gtk.EventBox.set_visible_window() per i dettagli.

set_above_child(above_child)

Setta se la finestra dell’event box debba essere posizionato sopra la finestra
del suo widget
child, anzichè sotto. Se la finestra e sopra, tutti gli eventi dentro la event
box andranno alla
eventbox. Se la finestra e sotto, gli eventi nella finestra del child, prima
andranno al child
stesso, poi al suo genitore. Il default è tenere la finestra sotto alla finestra
del child widget.
Parametri:
above_child: il boolean che a True pone la finestra dell’event box
sopra alla finestra del child widget;

set_visible_window(visible_window)

Setta se l’event box debba usare una finestra visibile o invisibile.
Il default è usare una finestra visibile.
In una finestra di event box invisibile, la window creata per l’event box è di
tipo
Gdk.WindowWindowClass.INPUT_ONLY, che significa appunto che è invisibile e serve
solo per
ricevere eventi. Una finestra di event box visibile, è di tipo
Gdk.WindowWindowClass.INPUT_OUTPUT,
cioè che agisce da parent window per tutti i widgets contenuti nell’event box.
Per intercettare solo gli eventi, la finestra di event box dovrebbe essere
invisibile.
Creare una finestra visibile, potrebbe generare anche degli artifacts visibili
all’utente,
specialmente se l’utente sta usando un tema con gradienti o pixmaps.
La ragione di creare un event box non input-only è se vogliamo settare un
background o disegnare
su di essa.
C’è un problema per gli event box invisibili che hanno la loro finestra sotto al
child (vedere
Gtk.EventBox.set_above_child(). Dal momento che la finestra input-only non è una
finestra
genitore di ogni finestra creata dai widgets discendenti dell’event box, gli
eventi su queste
finestre non sono propagati dal windowing system, ma solo da GTK+.
In pratica se un evento non è nell’event mask della finestra discendente (vedere
Gtk.Widget.add_events()), non sarà ricevuta dall’event box.
Questo non succede per gli event box visibili, perchè in tal caso, la finestra
della event box
è genitore delle finestre discendenti.
Parametri:
visible_window: il boolean che rende la finestra dell’event box
visibile;

Ecco un codice di esempio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
 
 
class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="EventBox example")
        self.set_default_size(250, 100)
        image = Gtk.Image.new_from_file("image.png")
        eventbox = Gtk.EventBox.new()
        eventbox.add(image)
        self.add(eventbox)
 
        eventbox.connect("button_press_event", self.on_click)
 
    def on_click(self, widget, param):
        print("INFO: clicked on %s" % widget.get_child().get_property("file"))
 
 
if __name__ == "__main__":
    win = GWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

link di riferimento:

torna all’indice degli appunti
Gtk3 EventBox


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python


PYGOBJECT: GTK.ICONVIEW

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

IconView

Un Gtk.IconView è un widget che visualizza una collezione di icone in una vista
a griglia.
Supporta il drag and drop, le selezioni multiple e il riordinamento degli
elementi.
Come per il Gtk.TreeView, il Gtk.IconView utilizza un Gtk.ListStore come
modello.
Invece di utilizzare i cell renderers, Gtk.IconView richiede che una delle sue
colonne, nel
proprio Gtk.ListStore, contenga oggetti GdkPixbuf.Pixbuf.

Le properties principali sono:

Name Type Flags Short Description activate-on-single-click bool r/w/en Attiva
una row con single click cell-area Gtk.CellArea r/w/co La Gtk.CellArea usata per
il layout delle celle column-spacing int r/w/en Spazio tra le colonne della
griglia columns int r/w/en Numero delle colonne da visualizzare item-orientation
Gtk.Orientation r/w/en Come sono posizionati testo e icona di ogni elemento
item-padding int r/w/en Padding tra gli elementi dell’icon view item-width int
r/w/en La larghezza usata per ogni elemento markup-column int r/w/en La colonna
del Model usata per il testo se usiamo Pango markup model Gtk.TreeModel r/w Il
model per l’icon view pixbuf-column int r/w/en La colonna del Model usata per i
pixbuf reorderable bool r/w/en la View è riordinabile row-spacing int r/w/en
Spazio tra le righe della griglia selection-mode Gtk.SelectionMode r/w/en Il
selection mode spacing int r/w/en Spazio tra le celle di un elemento text-column
int r/w/en La colonna del Model usata per il testo tooltip-column int r/w/en La
colonna nel model che contiene i testi dei tooltip per gli elementi

Segnali

I principali segnali di Gtk.IconView sono:

Name Short Description activate-cursor-item Un keybinding signal emesso quando
lo user attiva l’elemento in focus item-activated Il segnale “item-activated”
viene emesso quando chiamiamo il metodo Gtk.IconView.item_activated(), quando lo
user fa doppio click
su un elemento con la property “activate-on-single-click” settata a False, o
quando lo user clicca un elemento con property “activate-on-single-click”
settata a True move-cursor il segnale “move-cursor” è un keybinding signal
emesso quando lo user muove il cursore select-all Un keybinding signal emesso
quando lo user seleziona tutti gli elementi select-cursor-item Un keybinding
signal emesso quando lo user seleziona l’elemento in focus selection-changed Il
segnale “selection-changed” viene emesso quando la selezione cambia
toggle-cursor-item Un keybinding signal emesso quando lo user cambia lo stato
dell’elemento (toggle) unselect-all Un keybinding signal emesso quando lo user
deseleziona tutti gli elementi

Metodi

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

new()

Crea un nuovo widget Gtk.IconView.

1
2
3
4
>>> import gi
... gi.require_version('Gtk', '3.0')
... from gi.repository import Gtk
>>> iconview = Gtk.IconView.new()

new_with_area(area)

Crea un nuovo Gtk.IconView usando l’area specificata per il layout delle celle.
Parametri:
area: il Gtk.CellArea da usare per il layout delle celle;

new_with_model(model)

Crea un nuovo Gtk.IconView con il model passato come argomento.
Parametri:
model: il Gtk.TreeModel, ovvero il model dell’iconview;

convert_widget_to_bin_window_coords(wx, wy)

Converte le coordinate del widget in coordinate per la bin_window, come ci si
aspetta, ad esempio,
da Gtk.IconView.get_path_at_pos().
Parametri:
wx: le coord. X relative al widget;
wy: le coord. Y relative al widget;

create_drag_icon(path)

Crea una rappresentazione cairo.Surface dell’elemento al percorso at path.
Questa immagine è usata per una drag icon.
Parametri:
path (Gtk.TreePath): un Gtk.TreePath nell’iconview;

enable_model_drag_dest(targets, actions)

Rende l’iconview un Drop Destination (drop) durante un DragAndDrop automatico.
La chiamata a questo metodo setta la property “reorderable” si Gtk.IconView a
False.
Parametri:
targets: ([Gtk.TargetEntry]) – the table of targets that the drag will support
actions: (Gdk.DragAction) – the bitmask of possible actions for a drag to this
widget

enable_model_drag_source(start_button_mask, targets, actions)

Rende l’iconview un drag source (drag) per il DragAndDrop automatico.
La chiamata a questo metodo setta la property “reorderable” si Gtk.IconView a
False.
Parametri:
start_button_mask: il Gdk.ModifierType) cioè il mask dei buttons
abilitati ad iniziare il drag;
targets: il Gtk.TargetEntry, cioè la table dei targets che il
drag supporterà;
actions: la Gdk.DragAction, ovvero il bitmask delle possibili
azioni per il drag da questo widget;

get_activate_on_single_click()

Ritorna il settaggio effettuato con Gtk.IconView.set_activate_on_single_click(),
ovvero
ritorna True se l’elemento viene attivato con single click.

get_cell_rect(path, cell)

Ritorna False se non c’è alcun elemento altrimenti True, inoltre ritorna il
Gdk.Rectangle relativo
al path e cellrenderer passati come argomenti.
Parametri:
path: un Gtk.TreePath;
cell: un Gtk.CellRenderer o None;

get_column_spacing()

Ritorna il valore della spaziatura (property “column-spacing”) tra le colonne
dell’iconview.

get_columns()

Ritorna il numero delle colonne (property “columns”).

get_cursor()

Ritorna un boolean, il percorso corrente del cursore e la cella corrente con il
focus.
Il boolean sarà True se il cursore è settato, altrimenti False.
Se il cursore non è settato, il path ritornato sarà None. Se nessuna cella ha il
focus, allora la
cella ritornata sarà None.

get_dest_item_at_pos(drag_x, drag_y)

Determina l’elemento di destinazione in base alla posizione data. Se non ci sono
elementi alla
posizione data, ritorna None, altrimenti un tupla contenente il path
dell’elemento e la posizione
di drop.
Parametri:
drag_x: la posizione X per determinare l’elemento di destinazione;
drag_y: la posizione Y per determinare l’elemento di destinazione;

get_drag_dest_item()

Ritorna le informazioni sull’elemento che è stato evidenziato durante il drag.
Le info sono il path dell’elemento evidenziato (Gtk.TreePath) e la posizione di
drop
(Gtk.IconViewDropPosition)

get_item_at_pos(x, y)

Ritorna una tupla contenente il path (Gtk.TreePath) dell’elemento esistente alla
posizione data e
il renderer responsabile della cella alla posizione data (Gtk.CellRenderer).
Se non esiste alcun elemento alla posizione data, ritorna None.
Il path ritornato è relativo alle coordinate di bin_window.
A differenza di Gtk.IconView.get_path_at_pos(), questo metodo ottiene anche la
cella alla
posizione data.
Parametri:
x: La posizione X da identificare;
y: La posizione Y da identificare;

get_item_column(path)

Ritorna la colonna nella quale è visualizzato l’elemento con il path
specificato.
Parametri:
path: il Gtk.TreePath dell’elemento;

get_item_orientation()

Ritorna la posizione dei testi relativamente alla icone (property
“item-orientation”).

get_item_padding()

Ritorna il padding intorno agli elementi (property “item-padding”).

get_item_row(path)

Ritorna la riga nella quale è visualizzato l’elemento con il path specificato.
Parametri:
path: il Gtk.TreePath dell’elemento;

get_item_width()

Ritorna la larghezza del singolo elemento (property “item-width”).

get_margin()

Ritorna il valore dello spazio (property “margin”) lasciato ai bordi (top,
bottom, left, right)
dell’iconview.

get_markup_column()

Ritorna la colonna dedicata al markup o -1 se non è settata.

get_model()

Ritorna il model (Gtk.TreeModel) su cui si basa il Gtk.IconView.

get_path_at_pos(x, y)

Ritorna il Gtk.TreePath corrispondente all’icona esistente alla posizione data,
o None.
Il path trovato è relativo alle coordinate di bin_window. Vedere
Gtk.IconView.get_item_at_pos(),
se si è interessati anche alla cella presente alla posizione data.
Vedere Gtk.IconView.convert_widget_to_bin_window_coords() per la conversione di
coordinate widget
in coordinate bin_window.
Parametri:
x: La posizione X da identificare;
y: La posizione Y da identificare;

get_pixbuf_column()

Ritorna la colonna dedicata ai Pixbufs o -1 se non è stata settata.

get_reorderable()

Ritorna True se la lista può essere riordinata. Vedere
Gtk.IconView.set_reorderable().

get_row_spacing()

Ritorna il valore della spaziatura (property “row-spacing”) tra righe
dell’iconview.

get_selected_items()

Ritorna la lista (GLib.List) con i paths (Gtk.TreePath) di tutti gli elementi
selezionati.

get_selection_mode()

Ritorna il selection mode (Gtk.SelectionMode) dell’iconview.

get_spacing()

Ritorna il valore della spaziatura (property “spacing”) tra le celle di un
elemento,
ad esempio lo spazio che c’è tra l’icona e il testo.

get_text_column()

Ritorna la colonna dedicata al testo o -1 se non è stata settata.

get_tooltip_column()

Ritorna la colonna dedicata al tooltip delle righe dell’iconview o -1 se non è
stata settata.

get_tooltip_context(x, y, keyboard_tip)

Ritorna un boolean che indica se il tooltip dato punta ad un elemento, la
coordinata X,
la coordinata Y, il model (Gtk.TreeModel), il path (Gtk.TreePath),
l’iter(Gtk.TreeIter).
I valori x, y e keyboard_tip che sono ricevuti nel signal handler, devono essere
passati a
questo metodo. In pratica il valore ritornato indica se esiste un elemento
dell’iconview alle
coordinate date (True) o meno (False) per i mouse tooltips.
Per i keyboard tooltips l’elemento ritornato sarà l’elemento del cursore.
Parametri:
x: la coordinata X relativa alle coordinate del widget;
y: la coordinata Y relativa alle coordinate del widget;
keyboard_tip: True se è un keyboard tooltip altrimenti False;

get_visible_range()

Ritorna None se non c’è un range visible, oppure una tupla contenente: l’inizio
della regione,
la fine della regione: (start_path: Gtk.TreePath, end_path: Gtk.TreePath).

item_activated(path)

Attiva l’elemento determinato dal path passato come argomento.
Parametri:
path: il Gtk.TreePath dell’elemento da attivare;

path_is_selected(path)

Ritorna True se l’icona a cui punta il path è selezionata.
Se il path non punta ad una posizione valida, viene ritornato False.
Parametri:
path: il Gtk.TreePath da controllare;

scroll_to_path(path, use_align, row_align, col_align)

Parametri:


path: (Gtk.TreePath) – The path of the item to move to.
use_align: (bool) – whether to use alignment arguments, or False.
row_align: (float) – The vertical alignment of the item specified by path.
col_align: (float) – The horizontal alignment of the item specified by path.

Muove gli alignments dell’iconview alla posizione specificata da path.
row_align determina dove la row è posizionata, e col_align determina la colonna.
Entrambe richiedono valori tar 0.0 e 1.0, dove 0.0 sta per left/top alignment,
1.0 sta per
right/bottom alignment, 0.5 sta per centrato.
Se use_align è False, gli argomenti alignment vengono ignorati, e il tree
richiederà un lavoro
minimo per scorrere l’elemento. Se l’elemento è già visibile a schermo, non
succederà nulla.
Questo metodo funziona solo se è settato un model e path è una riga valida del
model.
Se il model cambia prima che l’iconview venga generato, il path centrato, verrà
modificato
per essere coerente con la modifica del model.

select_all()

Seleziona tutte le icone.

select_path(path)

Seleziona la riga con il path passato come argomento.
Parametri:
path: il Gtk.TreePath da cui selezionare la riga;

selected_foreach(func, *data)

Chiama una funzione per ogni icona selezionata. Il model non può essere
modificato all’interno
di questa funzione.
Parametri:
func: la Gtk.IconViewForeachFunc, ovvero la funzione da chiamare
per ogni icona selezionata;
data: i dati da passare alla funzione;

set_activate_on_single_click(single)

Causa l’emissionde del segnale “item-activated” con un single click invece che
con doppio click.
Parametri:
single: il boolean che settato a True emette un segnale
“item-activated” su un single click;

set_column_spacing(column_spacing)

Setta la property “column-spacing” che specifica la spaziatura tra le colonne
dell’iconview.
Parametri:
column_spacing: il valore della spaziatura tra colonne;

set_columns(columns)

Setta la property “columns” che determina quante colonne sono presenti
nell’iconview.
Se columns è -1, il numero di colonne sarà scelto automaticamente per riempire
l’area disponibile.
Parametri:
columns: il numero di colonne presenti nell’iconview;

set_cursor(path, cell, start_editing)

Setta il corrente keyboard focus a path, e lo seleziona.
Questo è comodo quando vogliamo richiamare l’attenzione dell’utente mettendo il
focus su
un determinato elemento. Se cell non è None, il focus viene dato alla cella
stessa.
Se start_editing è True, l’editing verrà iniziato nella cella specificata.
Parametri:
path: il Gtk.TreePath o None;
cell: il Gtk.CellRenderer o None;
start_editing: True se la cella specificata deve essere editata;

set_drag_dest_item(path, pos)

Setta l’elemento che viene evidenziato per il feedback.
Parametri:
path: il Gtk.TreePath (o None) dell’elemento da evidenziare;
pos: il Gtk.IconViewDropPosition che specifica dove eseguire il
drop, relativo all’elemento;

set_item_orientation(orientation)

Setta la property “item-orientation” che determina se le label sono disegnate a
fianco delle
icone, invece che sotto.
Parametri:
orientation: il Gtk.Orientation ovvero la posizione dei testi
rispetto alle icone. Il valore dell’enum Gtk.Orientation può essere
Gtk.Orientation.VERTICAL e
Gtk.Orientation.HORIZONTAL;

set_item_padding(item_padding)

Setta la property di Gtk.IconView “item-padding” che specifica il padding
attorna ad ogni elemento
dell’iconview.
Parametri:
item_padding: il padding attorno ad ogni elemento;

set_item_width(item_width)

Setta la property “item-width” che specifica la larghezza da usare per ogni
elemento.
Se viene settata a -1, l’iconview determinerà automaticamente la dimensione più
adatta.
Parametri:
item_width: la larghezza di ogni elemento;

set_margin(margin)

Setta la property “margin” che specifica lo spazio inserito ai bordi (top,
bottom, left, right)
dell’iconview.
Parametri:
margin: il valore del margine da settare;

set_markup_column(column)

Setta la colonna con le info di markup per l’iconview. La colonna di markup deve
essere di tipo
GObject.TYPE_STRING.
Parametri:
column: l’indice della colonna da settare o -1 per non
visualizzare il markup text;

set_model(model)

Setta il model del Gtk.IconView. Se l’iconview ha già un model settato, questo
verrà rimosso prima
di settare il model nuovo. Se model è None, allora verrà rimosso il vecchio
model.
Parametri:
model: il Gtk.TreeModel (o None) dell’iconview;

set_pixbuf_column(column)

Parametri:
column: l’indice della colonna da settare per i pixbufs o -1
per disabilitarla;

Setta la colonna con i pixbufs

set_reorderable(reorderable)

Parametri:
reorderable: True se la lista di elementi può essere riordinata;

Questo metodo permette di riordinare models che supportano
Gtk.TreeDragSourceIface e
Gtk.TreeDragDestIface. Sia Gtk.TreeStore che Gtk.ListStore supportano questa
funzionalità.
Se reorderable è True, lo user può riordinare il model facendo drag and drop con
le righe.
E’ possibile intercettare tali cambiamenti collegando i segnali del model
“row_inserted” e
“row_deleted”. Il riordinamento è implementato settando l’iconview come drag
source
e destination.

set_row_spacing(row_spacing)

Setta la property “row-spacing” che specifica la spaziatura tra le righe
dell’iconview.
Parametri:
row_spacing: il valore della spaziatura tra le righe;

set_selection_mode(mode)

Setta il selection mode dell’iconview. I valori dell’enum Gtk.SelectionMode
possono assumere i
seguenti valori:
NONE (0): nessuna selezione è possibile;
SINGLE (1): nessuno o un elemento solo può essere selezionato;
BROWSE (2): esattamente un elemento può essere selezionato;
MULTIPLE (3): può essere selezionato qualsiasi numero di elementi;
Parametri:
mode: il Gtk.SelectionMode dell’iconview.

set_spacing(spacing)

Setta la property “spacing” che specifica la spaziatura presente tra le celle di
un elemento
(ad esempio tra icona e testo).
Parametri:
spacing: il valore della spaziatura tra le celle di un elemento;

set_text_column(column)

Setta la colonna con il testo, e deve essere di tipo GObject.TYPE_STRING.
Parametri:
column: l’indice della colonna del model con il testo o -1 per
non visualizzare il testo;

set_tooltip_cell(tooltip, path, cell)

Setta la tip area del tooltip. Vedere anche Gtk.Tooltip.set_tip_area() o, per
una semplice
alternativa, Gtk.IconView.set_tooltip_column().
Parametri:
tooltip: il Gtk.Tooltip da settare;
path: il Gtk.TreePath;
cell: il Gtk.CellRenderer (o None) su cui settare il tooltip;

set_tooltip_column(column)

Se vogliamo avere tooltips semplici (solo testo) a pieno elemento, possiamo
usare questo metodo
per far gestire i tooltip automaticamente dal Gtk.IconView.
column deve essere settata alla colonna del model che contiene i testi dei
tooltipis, o -1 per
disabilitare questo aspetto. Quando abilitato, la property “has-tooltip” di
Gtk.Widget sarà
settata a True e l’iconview sarà connesso all’handler del segnale
“query-tooltip” di Gtk.Widget.
Nota: l’handler di segnale setta il testo con il metodo
Gtk.Tooltip.set_markup(), così facendo
è necessario l’escape dei caratteri quali &, <. Parametri:
column: l’indice della colonna per i tooltips;

set_tooltip_item(tooltip, path)

Setta la tip area del tooltip per essere coperta dall’elemento con percorso
path.
Vedere anche Gtk.IconView.set_tooltip_column() per una semplice alternativa, o
Gtk.Tooltip.set_tip_area().
Parametri:
tooltip: il Gtk.Tooltip;
path: il Gtk.TreePath dell’elemento che coprirà il tooltip;

unselect_all()

Deseleziona tutte le icone.

unselect_path(path)

Deseleziona la riga di percorso path.
Parametri:
path: il Gtk.TreePath della row da deselezionare;

unset_model_drag_dest()

Annulla l’effetto di Gtk.IconView.enable_model_drag_dest().
La chiamata a questo metodo setta la property “reorderable” a False.

unset_model_drag_source()

Annulla l’effetto di Gtk.IconView.enable_model_drag_source().
La chiamata a questo metodo setta la property “reorderable” a False.

Di seguito un codice di esempio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository.GdkPixbuf import Pixbuf
 
 
class GWindow(Gtk.Window):
  def __init__(self):
    super().__init__(title="IconView example")
    self.set_default_size(150, 200)
    icons = ["edit-cut", "edit-paste", "edit-copy"]
    model = Gtk.ListStore(Pixbuf, str)
    iconview = Gtk.IconView.new()
    iconview.set_model(model)
    iconview.set_pixbuf_column(0)
    iconview.set_text_column(1)
    iconview.set_item_orientation(Gtk.Orientation.HORIZONTAL)
    iconview.set_reorderable(True)
 
    for icon in icons:
        pixbuf = Gtk.IconTheme.get_default().load_icon(icon, 64, 0)
        model.append([pixbuf, icon.split("-")[1]])
 
    self.add(iconview)
 
 
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 IconView


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python


PYGOBJECT: SIGNALS

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

Main loop e Signals

GTK+ utilizza un modello di programmazione event-driven, ovvero GTK+ attende nel
mainloop che un
utente esegua un’azione. Quando questo avviene, ad esempio un click su un
pulsante,
il mainloop se ne accorge e spedisce l’evento corrispondente a GTK+.
Quando un widget (es. Button) riceve un evento (es. viene premuto), emette uno o
più segnali.
Questi segnali notificano al programma che sta accadendo qualcosa di
interessante ed invocano le
funzioni (callbacks) che ad essi sono collegate.
Quando la callback ha terminato il suo compito, GTK+ ritorna nel mainloop
attendendo una nuova
azione da parte dell’utente.

Il metodo che lega un widget ad un evento è connect(event, callback, *data):

1
handler_id = widget.connect("event", callback, data)

widget: è un’istanza di un widget creata in precedenza;

Parametri:
event: è l’evento al quale siamo interessati. In genere ogni
widget ha un evento particolare, ad esempio Button sarà interessato all’evento
“clicked”.
callback: il nome della funzione di callback che verrà invocata
quando quel determinato evento accadrà;
data: opzionale ed indica i valori da passare alla callback;

Il metodo connect(), ritorna il numero identificativo dell’handler che gestisce
la coppia signal-callback.

1
2
3
4
5
6
7
8
>>> import gi
>>> gi.require_version("Gtk", "3.0")
>>> from gi.repository import Gtk
>>> button = Gtk.Button(label="Ok")
>>> button.connect("clicked", lambda widget: print("clicked"))
23
>>> button.clicked()
clicked

Qualora dovessimo disconnettere il widget da quel segnale, è possibile
utilizzare il metodo
disconnect(handler_id):

1
2
3
4
>>> button.disconnect(23)
>>> button.clicked()
 
>>>

E’ possibile anche disconnettere un widget da un evento, via funzione, con il
metodo
disconnect_by_func(callback):

1
2
3
4
5
6
7
8
9
10
11
12
>>> def on_click(button):
...     print("clicked")   
...    
>>> button.connect("clicked", on_click)
24
>>> button.clicked()
clicked
>>> button.disconnect_by_func(on_click)
1
>>> button.clicked()
 
>>>

Gtk.main_quit()

Connettere l’applicazione al segnale “destroy” della top-level window.
Quando l’utente chiude la toplevel window, l’handler di default per questo
segnale distrugge
la window, ma non termina l’applicazione.
Connettendo il segnale “destroy” della top-level window alla Gtk.main_quit()
darà invece il
risultato desiderato.

1
window.connect("destroy", Gtk.main_quit)

La chiamata a Gtk.main_quit() fa ritornare il main loop precedentemente creato
con Gtk.main().

Objects

GObject è il “tipo” fondamentale che fornisce gli attributi e i metodi per tutti
i tipi di oggetto di GTK+, Pango e le altre librerie basate su GObject.
La classe GObject.GObject fornisce i metodi per la costruzione e la distruzione
degli oggetti, i metodi per l’accesso alle properties degli oggetti, il supporto
ai segnali.

Signals

I Signals connettono eventi arbitrari ai “listeners” di competenza.
Per esempio in GTK+, ogni evento (pressione di un tasto o movimento del mouse),
viene ricevuto dal
server X che genera un evento GTK+ sotto forma di emissione di segnale.
Ogni segnale viene registrato nel type system insieme al type, sul quale può
eseere emesso.
Per quel type, verrà registrata una funzione che sarà invocata ogni volta che
sarà emesso quel
segnale specifico. Un segnale può essere emesso anche volontariamente o si può
decidere di fermare
l’emissione del segnale dall’interno di una delle funzioni connesse a quel
segnale.

Creare un nuovo segnale

Possiamo creare nuovi segnali aggiungendoli al dizionario
GObject.GObject.__gsignals__:
Quando un nuovo segnale viene creato, può essere definito anche un
method-handler, che sarà
invocato ogni volta che il segnale verrà emesso.

1
2
3
4
5
class CustomObject(GObject.GObject):
    __gsignals__ = {'custom_signal': (GObject.SIGNAL_RUN_FIRST, None, (int,)),}
 
    def emit_signal(self, arg):
        print("method handler for 'custom_signal' called with argument", arg)

Parametri:
GObject.SIGNAL_RUN_FIRST: indica che questo segnale invocherà
il method handler definito (emit_signal()) nella fase di prima emissione.
Le alternative sono:
GObject.SIGNAL_RUN_LAST: il method handler sarà invocato nella terza fase di
emissione;
GObject.SIGNAL_RUN_CLEANUP: invoca il method handler nell’ultima fase di
emissione.
None: indica cosa ritorna il segnale, di solito None.
(int,): indica gli argomenti del segnale.
Nel nostro caso il segnale prende un solo argomento di tipo int.

I segnali possono essere emessi con il metodo GObject.GObject.emit():

1
2
3
4
5
6
7
8
9
10
>>> from gi.repository import GObject
>>> class CustomObject(GObject.GObject):
...     __gsignals__ = {'custom_signal': (GObject.SIGNAL_RUN_FIRST, None,
(int,)),}
...
...     def do_custom_signal(self, arg):
...         print("method handler for 'custom_signal' called with argument",
arg)
...        
>>> obj = CustomObject()
>>> obj.emit("custom_signal", 23)
method handler for 'custom_signal' called with argument 23

link di riferimento:
torna all’indice degli appunti
python gtk3 tutorial
Gtk3


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python


PYGOBJECT: PROPERTIES

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

Properties

Le Properties descrivono la configurazione e lo stato dei widgets.
Come per i segnali, ogni widget ha il proprio set di properties.
Ad esempio un Button ha la property “label” che contiene il testo della label
dentro al button.
Quando creiamo un’istanza di un widget, possiamo specificare il nome e il valore
di una property,
passandola come keyword argument.
Ad esempio per creare una label allineata sulla destra con il testo “Hello
World” ed un angolo
di 25 gradi, useremo la sintassi:

1
label = Gtk.Label(label="Hello World", angle=25, halign=Gtk.Align.END)

che è l’equivalente di scrivere:

1
2
3
4
label = Gtk.Label()
label.set_label("Hello World")
label.set_angle(25)
label.set_halign(Gtk.Align.END)

Invece di usare i getters e i setters, possiamo ottenere e settare le properties
attraverso la
property props, con la sintassi:

1
widget.props.prop_name = value

Per sapere quali properties sono disponibili per un widget, possiamo scrivere:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> for prop in dir(button.props):
...     print(prop)
...    
action_name
action_target
always_show_image
app_paintable
...
 
>>> button.props.label
'Ok'
>>> button.props.label = "Click"
>>> button.props.label
'Click'

Utilizzo di properties esistenti

La classe GObject.GObject fornisce le seguenti funzioni per gestire le
properties esistenti:
GObject.GObject.get_property() e GObject.GObject.set_property().
Come accennato in precedenza, alcune properties hanno funzioni ad esse dedicate
(getter e setter).
Ad esempio per la property “label” di un Button, ci sono 2 funzioni, la getter
Gtk.Button.get_label()
e la setter Gtk.Button.set_label(label).

Creare nuove properties

Una property viene definita tramite “name” e “type”.
Nonostante Python stesso sia tipizzato dinamicamente, non potremo modificare una
property,
una volta che questa è stata definita. Per creare una property utilizzaiamo
GObject.Property:

1
2
3
4
5
6
7
8
from gi.repository import GObject
 
class CustomObject(GObject.GObject):
 
    pr_string = GObject.Property(type=str, default='bancaldo')
    pr_float = GObject.Property(type=float)
    def __init__(self):
        super().__init__()

Possiamo decidere che una property sia “readable”, “writable”, o “readwrite”.
Per farlo è necessario settare alcuni flags, in fase di definizione della
property stessa.
Queste Flags sono:
GObject.ParamFlags.READABLE: solo accesso in lettura;
GObject.ParamFlags.WRITABLE: solo accesso in scrittura;
GObject.ParamFlags.READWRITE: property pubblica, con accesso in
lettura e scrittura.

1
2
pr_1 = GObject.Property(type=str, flags = GObject.ParamFlags.READABLE) # non
scrivibile
pr_2 = GObject.Property(type=str, flags = GObject.ParamFlags.WRITABLE) # non
leggibile

Per definire una nuova property read-only possiamo utilizzare un metodo
con decoratore GObject.Property:

1
2
3
4
5
6
7
8
9
10
from gi.repository import GObject
 
class CustomObject(GObject.GObject):
 
    def __init__(self):
        super().__init__()
 
    @GObject.Property
    def readonly(self):
        return 'This is read-only property.'

Per accedere a questa property:

1
2
3
4
5
>>> myobj = CustomObject()
>>> myobj.readonly
'This is read-only property.'
>>> myobj.get_property("readonly")
'This is read-only property.'

La API di GObject.Property è molto simile alla built-in property() di python.
Possiamo creare i setter in maniera simile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CustomObject(GObject.Object):
    value = 0
 
    @GObject.Property
    def readonly(self):
        'Read only property.'
        return 1
 
    @GObject.Property(type=int)
    def my_int(self):
        'Read-write integer property.'
        return self.value
 
    @my_int.setter
    def my_int(self, value):
        self.value = value

1
2
3
4
5
6
7
8
>>> myobj = CustomObject()
>>> myobj.readonly
1
>>> myobj.my_int
0
>>> myobj.my_int = 2
>>> myobj.my_int
2

Ad esempio è possibile anche definire un valore minimo e massimo per i numeri:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from gi.repository import GObject
 
class CustomObject(GObject.GObject):
 
    __gproperties__ = {
        "int-prop": (int, # type
                     "integer prop", # nick
                     "A property that contains an integer", # desc
                     1, # min
                     5, # max
                     2, # default
                     GObject.ParamFlags.READWRITE # flags
                    ),
    }
 
    def __init__(self):
        super().__init__()
        self.int_prop = 2
 
    def do_get_property(self, prop):
        return self.int_prop
 
    def do_set_property(self, prop, value):
        self.int_prop = value

Le properties, come si nota, vanno definite nel dizionario __gproperties__ di
GObject.GObject, e gestite con i metodi:
do_get_property e do_set_property.

1
2
3
4
5
6
7
8
9
10
11
>>> obj = CustomObject()
>>> obj.get_property("int-prop")
2
 
>>> obj.set_property("int-prop", 10)
<string>:1: Warning: value "10" of type 'gint' is invalid or out of range for
property 'int-prop' of type 'gint'
>>> obj.set_property("int-prop", -2)
<string>:1: Warning: value "-2" of type 'gint' is invalid or out of range for
property 'int-prop' of type 'gint'
>>> obj.set_property("int-prop", 4)
>>> obj.get_property("int-prop")
4

se la property richiesta non è esistente, ovvero non fa parte del dizionario
__gproperties__,
verrà sollevata una eccezione TypeError:

1
2
3
4
5
6
7
8
obj = CustomObject()
myprop = "int-propp"
try:
    obj.get_property(myprop)
except TypeError:
    print("ERROR: %s property not found!" % myprop)
     
ERROR: int-propp property not found!

Segnale modifica property

Quando una property viene modificata, viene emesso un segnale il cui nome è
“notify::property-name”.
E’ quindi possibile connettere il segnale di modifica della property, del nostro
oggetto, ad una
callback, con il metodo connect(signal, callback):

1
2
3
4
5
6
7
>>> def on_notify_int_prop(obj, string):
...     print("INFO: 'int-prop' property changed")
...    
>>> obj.connect("notify::int-prop", on_notify_int_prop)
1
>>> obj.set_property("int-prop", 2)
INFO: 'int-prop' property changed

Nota:
Per convenzione il nome della callback da usare con il metodo connect(), per un
segnale
“notify::property-name”, sarà “on_notify_property_name”.

API

Ricapitolando vediamo i metodi principali della classe GObject.GObject:

get_property(property_name)

Recupera il valore di una property di nome “property_name”.

set_property(property_name, value)

Setta il valore di una property di nome “property_name” al valore “value”,
passato come argomento.

emit(signal_name, …)

Emette un segnale di nome “signal_name”. Gli argomenti opzionali da passare al
segnale devono
seguire “signal_name”. Se ad esempio il nostro segnale è di tipo (int,), viene
emesso come segue:

1
self.emit(signal_name, 42)

freeze_notify()

Questo metodo congela tutti i segnali “notify::” (che vengono cioè emessi ogni
volta che una
property viene modificata), finchè non viene invocato il metodo thaw_notify().
E’ consigliato utilizzare il metodo freeze_notify(), all’interno di un
with statement, in modo da assicurarsi che il metodo thaw_notify(),
sia invocato implicitamente alla fine del blocco with utilizzato.

1
2
3
with an_object.freeze_notify():
    # Do stuff
    ...

thaw_notify()

“scongela” tutti i segnali “notify::” che erano stati congelati dal metodo
freeze_notify().
Come detto in precedenza non è consigliato utilizzare thaw_notify()
esplicitamente,
ma utilizzare freeze_notify() con un with statement.

handler_block(handler_id)

Blocca un handler di un’istanza che non potrà essere chiamato durante
l’emissione di un segnale
che lo coinvolga, fino a chè non sarà chiamato il complementare
handler_unblock().
Questo blocco significa disattivare l’handler temporaneamente.
Un signal-handler deve essere sbloccato lo stesso numero di volte che è stato
bloccato, prima di
tornare attivo. Come per freeze/thaw, è raccomandato utilizzare handler_block()
all’interno di un with statement, che, raggiunta la fine, chiamerà
implicitamente
handler_unblock():

1
2
3
with an_object.handler_block(handler_id):
    # Do stuff
    ...

handler_unblock(handler_id)

Annulla l’effetto di handler_block(). Un handler boccato viene saltato durante
l’emissione di un segnale e non sarà invocato fino a quando non verrà sbloccato
lo stesso numero
di volte per cui è stato bloccato.
Come già visto non è consigliabile chiamare handler_unblock() esplicitamente,
ma usare handler_block() all’interno di un with statement.

__gsignals__

Un dizionario dove le classi ereditate possono definire nuovi segnali.
Ogni elemento nel dizionario è un nuovo segnale. La chiave è il nome del
segnale, il valore
invece, una tupla con la forma (GObject.SIGNAL_RUN_FIRST, None, (int,))
GObject.SIGNAL_RUN_FIRST: può essere rimpiazzato con
GObject.SIGNAL_RUN_LAST o GObject.SIGNAL_RUN_CLEANUP.
None: ciò che ritorna quel segnale;
(int,): lista dei parametri del segnale, deve finire con virgola.

__gproperties__

Un dizionario dove è possibile definire le properties del nostro oggetto.
Questo non è il metodo raccomandato per definire nuove proprietà, ma è utile per
aggiungere
caratteristiche supplementari come valore minimo e massimo ammessi.
La chiave è il nome della property, mentre il valore è una tupla che descrive
tale property.
Il numero degli elementi di questa tupa è variabile e dipende dal primo
elemento, ma la tuple
conterrà sempre, almeno i seguenti elementi in questo ordine:

property’s type esmepio int, float,
property’s nick name: una breve descrizione della property
(utilizzato da programmi come Glade);
property’s description (blurb): un’altra stringa con descrizione
più esaustiva (usata da Glade e programmi simili);
property’s flags: indica il tipo di accesso alla property,
GObject.PARAM_READABLE, GObject.PARAM_WRITABLE o GObject.PARAM_READWRITE;
In base al primo elemento della tupla (property’s type), possono seguire altri
elementi.
gli scenari sono:
– il primo elemento è di tipo bool o str, l’elemento successivo sarà:
default: valore di default della property;
– il type è int o float:
minimum: il minimo valore accettato,
maximum: il valore massimo accettato;
default: valore di default della property;
– il type non è nessuno di essi: nessun extra elemento

GObject.SIGNAL_RUN_FIRST

Invoca il method handler dell’oggetto nel primo stadio dell’emissione;

GObject.SIGNAL_RUN_LAST

Invoca il method handler dell’oggetto nel terzo stadio dell’emissione;

GObject.SIGNAL_RUN_CLEANUP

Invoca il method handler dell’oggetto nell’ultimo stadio dell’emissione;

GObject.ParamFlags.READABLE

La property è in sola lettura e non soggetta a modifica;

GObject.ParamFlags.WRITABLE

La property è in scrittura e quindi soggetta a modifica;

GObject.ParamFlags.READWRITE

La property è in lettura e scrittura (pubblica);

Unicode

Da Python3.0, tutte le stringhe sono memorizzate come Unicode in un’istanza di
str type.
Le Encoded strings, d’altro canto, sono rappresentate come binary data, in forma
di istanza di byte type.
In parole povere str fa riferimento a text, mentre bytes
fa riferimento a data.
Per convertire da str a bytes, usare str.encode(),
da bytes a str, usare bytes.decode().
Inoltre non è più possibile mixare strings con encoded strings:

1
2
3
4
5
6
7
8
9
10
>>> s = "àòè"
>>> s.encode()
b'\xc3\xa0\xc3\xb2\xc3\xa8'
>>> s.encode("utf-8")
b'\xc3\xa0\xc3\xb2\xc3\xa8'
>>> b = s.encode("utf-8")
>>> b
b'\xc3\xa0\xc3\xb2\xc3\xa8'
>>> b.decode("utf-8")
'àòè'

In GTK+ le cose sono molto più comode perchè PyGObject fa automaticamente
l’encode/decode da/in
UTF-8, quando passeremo una stringa ad un metodo, o un metodo ritornerà una
stringa.
In ogni caso verrà sempre rappresentato un testo/stringa come instanza di str:

1
2
3
4
5
6
7
8
9
10
11
>>> import gi
>>> gi.require_version("Gtk", "3.0")
>>> from gi.repository import Gtk
>>> label = Gtk.Label()
>>> text = "\xc3\xa7\xc3\xa7\xc3\xa7"
>>> label.set_text(text)
>>> txt = label.get_text()
>>> type(txt), txt
(<class 'str'>, 'ççç')
>>> txt == text
True

link di riferimento:
torna all’indice degli appunti
python gtk3 tutorial
Gtk3


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python


PYGOBJECT: DRAG AND DROP

13 Aprile 2020 bancaldo Commenti chiusi


torna all’indice appunti

Drag and drop

Impostare un Drag and Drop tra widgets consiste nel selezionare un Drag Source,
ovvero il widget dal quale cominceremo il Drag, selezionare un Drag Destination,
ovvero il widget sul quale eseguiremo il Drop, gestire i segnali su entrambi i
widget.
In maniera molto generica, un Drag Source viene selezionato con il metodo
Gtk.Widget.drag_source_set(),
mentre il Drag Destination, viene selezionato con il metodo
Gtk.Widget.drag_dest_set().

Alcuni widget specializzati, come Gtk.TreeView and Gtk.IconView, usano metodi
specifici per questa
operazione.

Un drag and drop basico richiede che il source sia connesso al segnale
“drag-data-get”
e il destination sia connesso al segnale “drag-data-received”.
Se invece abbiamo bisogno di maggior complessità, come aree di drop specifiche,
o icone di drag
personalizzate, sarà necessaria la connessione a segnali aggiuntivi e dovremo
interagire con
l’oggetto Gdk.DragContext.

Per trasferire dati tra source e destination, dobbiamo
interagire con la variabile Gtk.SelectionData fornita nei segnali
“drag-data-get”
e “drag-data-received”, usando i metodi getter e setter di Gtk.SelectionData.

Target Entries

Per permettere al drag source e al destination di conoscere quali dati stanno
rispettivamente
spedendo e ricevendo, è necessaria una lista comune di Gtk.TargetEntry.
Possiamo costruirla creando direttamente una lista di istanze Gtk.TargetEntry, o
creando
un oggetto Gtk.TargetList:

1
2
3
4
5
6
7
8
9
10
>>> targets = [
...     Gtk.TargetEntry.new("STRING", Gtk.TargetFlags.SAME_APP, 0),
...     Gtk.TargetEntry.new("image/png", Gtk.TargetFlags.SAME_APP, 1),
...            ]
>>> targets = Gtk.TargetList.new([
...     Gtk.TargetEntry.new("STRING", Gtk.TargetFlags.SAME_APP, 0),
...     Gtk.TargetEntry.new("image/png", Gtk.TargetFlags.SAME_APP, 1),
...            ])
>>> targets.find(Gdk.Atom.intern_static_string("STRING"))
(True, info=0)

Oppure utilizzare i metodi che mette a disposizione la classe Gtk.TargetList:
Gtk.TargetList.add_image_targets(info, writable),
Gtk.TargetList.add_text_targets(info), ecc.
Una volta creata la lista targets e abilitati i widget all’operazione di drag
and drop con
i metodi enable_model_drag_source(button_mask, targets, actions) ed
enable_model_drag_dest(targets, actions), non resta che associarla ai widget
source e destination, preposti al drag and drop, con i metodi
drag_dest_set_target_list(targets) e
drag_source_set_target_list(targets).

1
2
3
4
5
6
7
>>> drag_source = Gtk.IconView()
>>>
drag_source.enable_model_drag_source(start_button_mask=Gdk.ModifierType.BUTTON1_MASK,
targets=[],
...             actions=Gdk.DragAction.COPY)
>>> drag_dest = Gtk.IconView()
>>> drag_dest.enable_model_drag_dest(targets=[], actions=Gdk.DragAction.COPY)
>>> drag_source.drag_source_set_target_list(targets)
>>> drag_dest.drag_dest_set_target_list(targets)

Segnali

Drag Source Signals:

Name Emesso Scopo drag-begin Quando lo User unizia il drag Setta la icona di
drag drag-data-get Quando i dati sono richiesti dal destination Trasferisce i
dati del drag da source a destination drag-data-delete Quando un drag con la
action Gdk.DragAction.MOVE è completata Elimina i dati dal source per completare
il “move” drag-end Quando il drag è completo Anunlla quello fatto in drag-begin

Drag Destination Signals:

Name Emesso Scopo drag-motion Quando la icon Drag va sopra un’area di drop
Permette di eseguire il drop solo su certe aree drag-drop Quando la icona viene
lasciata su un’area di drop Permette di eseguire il drop solo su certe aree
drag-data-received Quando i dati di drag sono ricevuti dal destination
Trasferisce i dati del drag da source a destination

Ecco un codice di esempio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GdkPixbuf
 
 
class GWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Drag and Drop Example")
        self.set_default_size(300, 400)
 
        label_source = Gtk.Label(label="Drag source")
        label_destination = Gtk.Label(label="Drop Area")
        self.drag_source = DragSourceIconView()  # Source widget
        self.drag_dest = DragDestination()  # Destination widget
        button_img = Gtk.RadioButton.new_with_label_from_widget(
            None, "Drag image only")
        button_text = Gtk.RadioButton.new_with_label_from_widget(
            button_img, "Drag text only")
 
        # layout
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        label_box = Gtk.Box(spacing=12)
        label_box.pack_start(label_source, True, True, 0)
        label_box.pack_start(label_destination, True, True, 0)
        dnd_box = Gtk.Box(spacing=5)
        dnd_box.pack_start(self.drag_source, True, True, 0)
        dnd_box.pack_start(self.drag_dest, True, True, 0)
        button_box = Gtk.Box(spacing=6)
        button_box.pack_start(button_img, True, False, 0)
        button_box.pack_start(button_text, True, False, 0)
        vbox.pack_start(label_box, True, False, 0)
        vbox.pack_start(dnd_box, True, False, 0)
        vbox.pack_start(button_box, True, False, 0)
        self.add(vbox)
        # bindings
        button_img.connect("toggled", self.add_image_targets)
        button_text.connect("toggled", self.add_text_targets)
 
        self.add_image_targets()
 
    def add_image_targets(self, button=None):
        targets = Gtk.TargetList.new([])
        targets.add_image_targets(info=1, writable=True)
        self.drag_dest.drag_dest_set_target_list(targets)
        self.drag_source.drag_source_set_target_list(targets)
 
    def add_text_targets(self, button=None):
        targets = Gtk.TargetList.new([])
        targets.add_text_targets(info=0)
        self.drag_dest.drag_dest_set_target_list(targets)
        self.drag_source.drag_source_set_target_list(targets)
 
 
class DragSourceIconView(Gtk.IconView):
    def __init__(self):
        super().__init__()
        self.set_text_column(0)
        self.set_pixbuf_column(1)
 
        model = Gtk.ListStore(str, GdkPixbuf.Pixbuf)
        self.set_model(model)
        for text, icon in [("Item 1", "image-missing"),
                           ("Item 2", "help-about"), ("Item 3", "edit-copy")]:
            pixbuf = Gtk.IconTheme.get_default().load_icon(icon, 32, 0)
            self.get_model().append([text, pixbuf])
 
        self.enable_model_drag_source(
            start_button_mask=Gdk.ModifierType.BUTTON1_MASK, targets=[],
            actions=Gdk.DragAction.COPY)
        # bindings
        self.connect("drag-data-get", self.on_drag_data_get)
 
    def on_drag_data_get(self, widget, drag_context, data, info, time):
        selected_path = self.get_selected_items()[0]
        selected_iter = self.get_model().get_iter(selected_path)
        if info == 0:
            text = self.get_model().get_value(selected_iter, 0)
            data.set_text(text, -1)
        elif info == 1:
            pixbuf = self.get_model().get_value(selected_iter, 1)
            data.set_pixbuf(pixbuf)
 
 
class DragDestination(Gtk.IconView):
    def __init__(self):
        super().__init__()
        self.set_text_column(0)
        self.set_pixbuf_column(1)
 
        model = Gtk.ListStore(str, GdkPixbuf.Pixbuf)
        self.set_model(model)
        self.enable_model_drag_dest(targets=[], actions=Gdk.DragAction.COPY)
        # bindings
        self.connect("drag-data-received", self.on_drag_data_received)
 
    def on_drag_data_received(self, w, context, x, y, data, info, time, *args):
        model = w.get_model()
        pixbuf = text = None
        if info == 0:
            text = data.get_text()  # None if 'only image' is toggled
        elif info == 1:
            pixbuf = data.get_pixbuf()  # None if 'only text' is toggled
        model.append([text, pixbuf])
 
 
if __name__ == "__main__":
    win = GWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()



link di riferimento:

torna all’indice degli appunti
Drag and Drop


Categorie:Gtk3, PyGObject, python Tag: gtk3, PyGObject, python
Articoli precedenti

RSS
 * Google
 * Youdao
 * Xian Guo
 * Zhua Xia
 * My Yahoo!
 * newsgator
 * Bloglines
 * iNezha






UBUNTU COUNTER




CLUSTERMAPS




TAG CLOUD

channels conky django euler events flask git gtk3 iot kubuntu linux mqtt nfs pip
plex PyGObject pyinstaller pyodbc PyQt5 python pytyhon redis scrapy steam
sublimetext ubuntu venv virtualenv windows wx wxpython Xfce4 Xfwm4 xpath Xubuntu


BLOGROLL

 * Bancaldo @ wordpress.com


COMMENTI RECENTI

 * Visto nel Web – 173 | Ok, panico su Virtualbox: ubuntu15.04 risoluzione
   monitor 640×480
 * bancaldo su Notte magica: grazie Inter
 * LUCIO su Notte magica: grazie Inter
 * bancaldo su Philips serie 7 e PS3 Media Server
 * Christian Meneghini (@XeviaN360) su Philips serie 7 e PS3 Media Server


META

 * Accedi
 * Inserimenti feed
 * Feed dei commenti
 * WordPress.org


ARTICOLI RECENTI

 * PyGObject: Gtk.Builder
 * PyGObject: Gtk.Image
 * PyGObject: GdkPixbuf.Pixbuf
 * PyGObject: Gio.SimpleAction
 * PyGObject: Gio.ActionMap
 * PyGObject: Gtk.EventBox
 * PyGObject: Gtk.IconView
 * PyGObject: Signals
 * PyGObject: Properties
 * PyGObject: Drag and Drop
 * PyGObject: Gtk.Notebook
 * PyGObject: Gtk.MessageDialog
 * PyGObject: Gtk.TextView
 * PyGObject: Gtk.Toolbar
 * PyGObject: Gtk.ComboBox




Vai su WordPress
Copyright © 2007-2020 bancaldo™
Tema di NeoEase. XHTML 1.1 e CSS 3 convalidati.