Table des matières
Quelques nouveaux widgets et objets de contrôle ont été ajoutés dans PyGTK 2.4, incluant :
Action
(Action),
RadioAction
(Action d'exclusion), ToggleAction
(Action binaire) - objets qui représentent des actions qu'un utilisateur peut prendre. Les actions
contiennent l'information nécessaire pour créer des widgets délégués (proxy) (par exemple :
des icônes, des éléments de menu ou des élément de barre d'outils).
ActionGroup
- un objet contenant des Actions qui ont
une cetaine similarité, par exemple, les actions ouvrir, fermer et imprimer un document.
Border
- un objet contenant les valeurs
pour une bordure.ColorButton
- un bouton pour lancer un
dialogue de sélection de couleurs.ComboBox
- un widget proposant une liste d'éléments
parmi lequels choisir.
Il remplace l'OptionMenu
.ComboBoxEntry
- un widget fournissant un champ d'entrée
de texte avec une liste d'éléments parmi lesquels choisir. Il remplace
le Combo
.
EntryCompletion
- un objet permettant la complétion
dans un champ de saisie Entry
.
Expander
- un container qui peur montrer ou cacher son
enfant en réponse à un clic sur son bouton.FileChooser
- une interface pour le choix de
fichiersFileChooserWidget
- un widget implémentant l'interface
FileChooser
. Il remplace le
widget FileSelection
.
FileChooserDialog
- une fenêtre de dialogue utilisée
pour les actions "Fichier/Ouvrir" et "Fichier/Enregistrer". Elle remplace le
FileSelectionDialog
.
FileFilter
- un objet servant à filtrer les fichiers
selon un jeu interne de règles.
FontButton
- un bouton qui ouvre la fenêtre de
sélection de polices FontSelectionDialog
.
IconInfo
- un objet contenant des informations sur
une icône d'un IconTheme
.
IconTheme
- un objet permettant une consultation
des icônes avec leur nom et leur taille.
ToolItem
,
ToolButton
, RadioToolButton
,
SeparatorToolItem
,
ToggleToolButton
- widgets qui peuvent être inclus dans une
barre d'outils Toolbar
. Ils remplacent les items de
barre d'outils Toolbar
précédents.
TreeModelFilter
- un objet fournissant un outil puissant pour
transformer la représentation d'un modèle TreeModel
sous-jacent.
Il est décrit dans Section 14.10.2, « Le TreeModelFilter ».
UIManager
- un objet fournissant un moyen de construire
des menus et des barres d'outils à partir d'une description d'interface utilisateur (UI)
au format XML. Il possède aussi des méthodes pour gérer la fusion et séparation de multiples
descriptions d'interfaces utilisateur.
Les objets Action
et
ActionGroup
collaborent pour fournir les images, textes, fonctions
de rappel et accélérateurs aux menus et barre d'outils des applications.
L'UIManager
utilise les Action
et
ActionGroup
pour construire de manière automatique des barres de menu et des
barres d'outil basées sur une description XML.
Il est beaucoup plus facile de créer et remplir les menus et barres d'outil en utilisant le
UIManager
décrit dans une section ultérieure. Les sections
suivantes sur les objets Action
et ActionGroup
décrivent comment utiliser directement ces objets mais je recommande l'usage, dans la
mesure du possible, de l'UIManager
.
Un objet Action
représente une action que l'utilisateur peut effectuer
dans une interface d'application.
Il contient l'information utilisée par les éléments de l'interface
(par exemple, des éléments de MenuItem
ou de Toolbar
)
pour présenter l'action à l'utilisateur. Il existe deux sous-classes d'Action
:
ToggleAction | Un objet Action qui peut être commuté entre deux états
|
RadioAction | Un objet Action qui peuvent être regroupés mais
dont un seul peut être activé en même temps.
|
Par exemple, l'élément de menu standard Toolbar
peut
partager les mêmes icône, texte mnémonique et fonction de rappel. Ces deux éléments
d'interface peuvent être des éléments délégués de la même Action
.
Les widgets ordinaires Button
, ToggleButton
et RadioButton
peuvent aussi agir comme une Action
,
quoique le UIManager
ne possède aucun support pour ceux-ci.
Une Action
peut être créée en utilisant le
constructeur :
action = gtk.Action(name
,label
,tooltip
,stock_id
)
... où name
est une chaîne employée pour identifier
l'Action
dans un ActionGroup
ou
dans des descriptions d'UIManager
. Le label
et le tooltip
sont des chaînes utilisées comme étiquette et
infobulle dans des widgets délégués. Si label
vaut
None
alors stock_id
doit être une chaîne
indiquant un élément de Stock pour en récupérer le label.
Si tooltip
vaut None
, l'Action
n'aura pas d'infobulle.
Comme nous le verrons dans la Section 16.1.2, « ActionGroup »,
il est beaucoup plus facile de créer des objets Action en utilisant
les méthodes commodes de ActionGroup
:
actiongroup.add_actions(entries
,user_data
=None) actiongroup.add_toggle_actions(entries
,user_data
=None) actiongroup.add_radio_actions(entries
,value
=0,on_change
=None,user_data=None
)
On en reparlera plus loin, mais d'abord, décrivons comment utiliser
une Action
avec un Button
pour illustrer les opérations élémentaires de connection d'une
Action
à un widget délégué.
La procédure de base pour l'utilisation d'une
Action
avec un Bouton
proxy est
illustrée par le programme exemple
simpleaction.py. Le Bouton
est connecté à
l'Action
par la méthode :
action.connect_proxy(proxy
)
... où le proxy est un widget élément de menu MenuItem
,
élément de barre d'outils ToolItem
ou un
bouton Button
.
Une action (Action
) possède un signal, le signal
"activate" qui est déclenché quand l'Action
est activée,
normalement par le résultat d'une activation d'un widget proxy (par exemple,
on a cliqué sur un bouton de barre d'outils ToolButton
).
Il faut juste connecter une fonction de rappel à ce signal pour contrôler
l'activation de n'importe lequel des widgets délégués (proxy).
Voici le code source pour le programme exemple simpleaction.py :
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pygtk 4 pygtk.require('2.0') 5 import gtk 6 7 class SimpleAction: 8 def __init__(self): 9 # Créer la fenêtre de premier niveau 10 window = gtk.Window() 11 window.set_size_request(70, 30) 12 window.connect('destroy', lambda w: gtk.main_quit()) 13 14 # Créer un groupe de raccourcis 15 groupe_rapide = gtk.AccelGroup() 16 # Ajouter le groupe à la fenêtre de premier niveau 17 window.add_accel_group(groupe_rapide) 18 19 # Créer une action_quitte pour quitter le programme avec un élément de Stock 20 action_quitte = gtk.Action('Quitter', None, None, gtk.STOCK_QUIT) 21 # Connecter une fonction de rappel à l'action 22 action_quitte.connect('activate', self.fonct_quitte) 23 24 # Créer un ActionGroup appelé ActionSimple 25 groupe_actions = gtk.ActionGroup('ActionSimple') 26 # Ajouter l'action à groupe_actions avec un raccourci clavier 27 # "None" signifie utiliser l'accélérateur de l'élément Stock 28 groupe_actions.add_action_with_accel(action_quitte, None) 29 30 ## Lier l'action au groupe_rapide 31 action_quitte.set_accel_group(groupe_rapide) 32 33 # Connecter l'accélérateur à l'action 34 action_quitte.connect_accelerator() 35 36 # Créer un bouton pour l'utiliser comme autre widget délégué 37 bouton_quitter = gtk.Button() 38 # l'ajouter à la fenêtre 39 window.add(bouton_quitter) 40 41 # Lier l'action à son widget délégué 42 action_quitte.connect_proxy(bouton_quitter) 43 44 window.show_all() 45 return 46 47 def fonct_quitte(self, b): 48 print 'Quitter le programme' 49 gtk.main_quit() 50 51 if __name__ == '__main__': 52 sa = SimpleAction() 53 gtk.main()
L'exemple crée une Action
(ligne 20) qui
utilise un élément Stock Item pour récupérer le texte de l'étiquette avec un mnémonique,
une icône, un raccourci clavier et un domaine de traduction.
Si on n'utilise pas de Stock Item, il faut indiquer un label à la place.
Ligne 22, on connecte le signal "activate" du paramètre action
à la méthode self.quit_cb
() afin qu'elle soit appelée
quand l'action Action
est activée par le bouton
quitbutton
.
L'exemple simpleaction.py
utilise pas mal de code (lignes 15, 17, 31 et 34) pour installer le
raccourci pour le bouton.
La procédure est la même pour les éléments de menu MenuItem
,
les barres d'outils Toolbar
et les éléments de
barre d'outilsToolItem
.
La Figure 16.1, « Exemple d'Action simple » montre le résultat du programme simpleaction.py
Dans la section précédente nous avons vu qu'un widget existant pouvait
être connecté à une Action
comme intermédiaire.
Dans cette section nous verrons comment un widget délégué peut être créé par
les méthodes d'Action
:
menuitem = action.create_menu_item() toolitem = action.create_tool_item()
Le programme basicaction.py
montre un élément de menu MenuItem
, un bouton de
barre d'outils ToolButton
et un bouton
Button
partageant une même Action
.
Le MenuItem
et le ToolButton
ont
été créés par les méthodes précédentes. Voici le code source du programme
basicaction.py :
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pygtk 4 pygtk.require('2.0') 5 import gtk 6 7 class BasicAction: 8 def __init__(self): 9 # Créer la fenêtre de premier niveau 10 window = gtk.Window() 11 window.connect('destroy', lambda w: gtk.main_quit()) 12 vbox = gtk.VBox() 13 vbox.show() 14 window.add(vbox) 15 16 # Créer un groupe de raccourcis 17 groupe_rapide = gtk.AccelGroup() 18 # Ajouter le groupe à la fenêtre de premier niveau 19 window.add_accel_group(groupe_rapide) 20 21 # Créer une action_quitte pour quitter le programme avec un élément de Stock 22 action_quitte = gtk.Action('Quitter', '_Quittez moi ! ', 'Quitter le programme', 23 gtk.STOCK_QUIT) 24 action_quitte.set_property('short-label', '_Quitter') 25 # Connecter une fonction de rappel à l'action 26 action_quitte.connect('activate', self.fonct_quitte) 27 28 # Créer un ActionGroup appelé ActionBasic 29 groupe_actions = gtk.ActionGroup('ActionBasic') 30 # Ajouter l'action à groupe_actions avec un raccourci clavier 31 # "None" signifie utiliser le raccourci de l'élément Stock 32 groupe_actions.add_action_with_accel(action_quitte, None) 33 34 # Lier l'action au groupe_rapide 35 action_quitte.set_accel_group(groupe_rapide) 36 37 # Créer une barre de menu 38 barremenu = gtk.MenuBar() 39 barremenu.show() 40 vbox.pack_start(barremenu, False) 41 42 # Créer une action "Fichier" et l'élément de menu correspondant 43 action_fichier = gtk.Action('Fichier', '_Fichier', None, None) 44 groupe_actions.add_action(action_fichier) 45 elmenu_fichier = action_fichier.create_menu_item() 46 barremenu.append(elmenu_fichier) 47 48 # Créer le menu Fichier 49 menu_fichier = gtk.Menu() 50 elmenu_fichier.set_submenu(menu_fichier) 51 52 # Créer un élément de menu délégué 53 menuitem = action_quitte.create_menu_item() 54 menu_fichier.append(menuitem) 55 56 # Créer une barre d'outils 57 barreoutils = gtk.Toolbar() 58 barreoutils.show() 59 vbox.pack_start(barreoutils, False) 60 61 # Créer un élément de barre d'outils délégué 62 elbarre1 = action_quitte.create_tool_item() 63 barreoutils.insert(elbarre1, 0) 64 65 # Créer et placer l'étiquette 66 label = gtk.Label(''' 67 Choisir Fichier->Quittez moi ! ou 68 cliquer sur le bouton Quitter de la barre d'outils ou 69 cliquer sur le bouton Quitter du bas ou 70 taper Control+q 71 pour sortir. 72 ''') 73 label.show() 74 vbox.pack_start(label) 75 76 # Créer un bouton pour l'utiliser comme autre widget délégué 77 bouton_quitter = gtk.Button() 78 # l'ajouter à la fenêtre 79 vbox.pack_start(bouton_quitter, False) 80 81 # Lier l'action à son widget délégué 82 action_quitte.connect_proxy(bouton_quitter) 83 # On doit placer l'infobulle après l'ajout de l'élément à la barre d'outils 84 action_quitte.set_property('tooltip', action_quitte.get_property('tooltip')) 85 les_infobulles = gtk.Tooltips() 86 les_infobulles.set_tip(bouton_quitter, action_quitte.get_property('tooltip')) 87 88 window.show() 89 return 90 91 def fonct_quitte(self, b): 92 print 'On quitte le programme' 93 gtk.main_quit() 94 95 if __name__ == '__main__': 96 ba = BasicAction() 97 gtk.main()
Cet exemple introduit un groupe d'actions ActionGroup
contenant les Action
utilisées dans ce programme. La
Section 16.1.2, « ActionGroup » entrera plus dans le détail de
l'utilisation des ActionGroup
.
Le code des lignes 9-14 crée une fenêtre de premier niveau contenant une
boîte VBox
. Lignes 16-35, on crée l'
Action
"Quitter" semblable à celle du programme
simpleaction.py et on l'ajoute
(ligne 32) avec le raccourci gtk.STOCK_QUIT
à l'
ActionGroup
"BasicAction" créé ligne 29. Noter que,
contrairement au programme simpleaction.py,
il n'est pas nécessaire d'appeler la méthode connect_accelerator
(),
celle-ci étant appelée automatiquement quand la méthode
create_menu_item
() est appelée ligne 53.
Lignes 38-40, on crée une barre de menu MenuBar
et on
la place dans la VBox
. Lignes 43-44, on crée une
Action
(action_fichier
) pour le
menu et on l'ajoute au actiongroup
.
Les éléments de menu et
sont créés lignes 45 et 53 et ajoutés à la barre de menu barremenu
et au menu menu_fichier
en ligne 46 et 54.
De la même manière, on crée une Toolbar
et on l'ajoute
à la VBox
aux lignes 57-59. Le ToolItem
délégué est créé et ajouté à la Toolbar
barreoutils
ligne 62-63. Noter que l'infobulle de l'
Action
doit être établie (ligne 84) après l'ajout
du ToolItem
à la Toolbar
pour être utilisable. De même l'infobulle du Button
doit être ajouté manuellement (lignes 84-86).
La Figure 16.2, « Exemple d'Action élémentaire » montre le programme basicaction.py en action.
Un widget délégué peut être déconnecté d'une
Action
par la méthode :
action.disconnect_proxy(proxy
)
Une Action
possède un certain nombre de propriétés
qui contrôlent l'affichage et le fonctionnement de ses widgets délégués.
Parmi celles-ci, les plus importantes sont les propriétés "sensitive" et "visible".
La propriété "sensitive" détermine la sensibilité des widgets délégués.
Si "sensitive" est FALSE
les widgets délégués ne sont
pas activables et seront normalement affichés "grisés".
De même, la propriété "visible" détermine si les widgets délégués seront visibles.
Si la propriété "visible" d'une Action
est
FALSE
, ses widgets délégués seront cachés.
Comme on le verra dans la prochaine section, la sensibilité
ou la visibilité d'une Action
est également contrôlée
par la sensibilité ou la visibilité de l'ActionGroup
auquel elle appartient. Par conséquent, pour qu'une Action
soit sensible (ou visible), elle-même et son ActionGroup
doivent être sensibles (ou visibles) tous les deux.
Pour déterminer la sensibilité ou visibilité effective d'une Action
,
il faut utiliser les méthodes suivantes :
resultat = action.is_sensitive() resultat = action.is_visible()
Le nom assigné à une Action
est
contenu dans sa propriété "name" qui est établie lors de la création de
l'Action
. On peut retrouver ce nom par la méthode :
nom = action.get_name()
Les autres propriétés qui contrôlent l'affichage des widgets
délégués d'une Action
sont :
"hide-if-empty" | Si vaut TRUE , les contrôles délégués de
menu vides sont cachés pour cette action. |
"is-important" | Si vaut TRUE , les délégués
ToolItem proxies pour cette action affiche le texte dans le mode
gtk.TOOLBAR_BOTH_HORIZ . |
"visible-horizontal" | Si vaut TRUE , le
ToolItem est visible quand la barre d'outils est
horizontale. |
"visible-vertical" | Si vaut TRUE , le
ToolItem est visible quand la barre
d'outils est verticale. |
Autres propriétés intéressantes :
"label" | L'étiquette utilisée pour les éléments de menu et les boutons qui déclenchent cette action. |
"short-label" | Une étiquette plus courte qui peut être utilisée sur les boutons de barres d'outils et les boutons simples. |
"stock-id" | L'élément de Stock à utiliser pour recupérer l'icône, l'étiquette et le raccourci à utiliser dans les widgets qui représentent cette action. |
"tooltip" | Une infobulle pour cette action. |
Noter que le programme d'exemple
basicaction.py réécrit l'étiquette du gtk.STOCK_QUIT
avec
"_Quitter moi !" et définit l'étiquette courte à "_Quitter". L'étiquette courte est
utilisée pour le bouton de barre d'outil ToolButton
et pour
le bouton isolé. L'étiquette compléte est utilisée pour
le l'élément de menu MenuItem
. Noter aussi que l'infobulle
ne peut pas être définie pour un ToolItem
tant qu'elle n'est
pas ajoutée à la barre d'outils Toolbar
.
Une Action
a trois méthodes qui peuvent être
employées pour établir un accélérateur (raccourci clavier) :
action.set_accel_group(accel_group
) action.set_accel_path(accel_path
) action.connect_accelerator()
Celles-ci, outre la méthode
gtk.ActionGroup.add_action_with_accel
(), devraient couvrir
la plupart des cas de création d'accélérateur.
Il faut toujours définir un AccelGroup
pour une Action
. La méthode set_accel_path
()
est appelée par la méthode gtk.ActionGroup.add_action_with_accel
().
Si on utilise la méthode set_accel_path
(), le chemin de l'accélérateur
doit avoir le format par défaut :
"<Actions>/nom_du_groupe_actions/nom_de_action". Enfin, la méthode
connect_accelerator
() est appelée pour compléter la
mise en place de l'accélérateur.
Une Action
doit avoir un AccelGroup
et un chemin d'accélérateur associé avant que la méthode
connect_accelerator
() soit appelée.
Puisque la méthode connect_accelerator
() peut
être appelée plusieurs fois (par exemple, une fois pour chaque widget délégué),
le nombre d'appels est compté, ainsi un nombre égal d'appels à la méthode
disconnect_accelerator
() doit être réalisé avant
d'éliminer l'accélérateur.
Comme illustré dans les programmes d'exemple précédents, un accélérateur
d'Action
peut être employé par tous les widgets délégués.
Une Action
doit faire partie d'un ActionGroup
afin d'utiliser le chemin d'accélérateur par défaut avec ce format :
"<Actions>/nom_du_groupe_actions/nom_de_action". La manière la plus simple
d'ajouter un accélérateur est d'utiliser la méthode
gtk.ActionGroup.add_action_with_accel
() et la procédure
générale suivante :
AccelGroup
et l'ajouter à la fenêtre
de premier niveau.ActionGroup
Action
en précisant un élément de
Stock avec un accélérateur.Action
à
l'ActionGroup
avec la méthode
gtk.ActionGroup.add_action_with_accel
() en indiquant
None
pour utiliser l'accélérateur de l'élément de Stock ou une chaîne
d'accélérateur acceptable par la méthode gtk.accelerator_parse
().AccelGroup
pour
l'Action
en utilisant la méthode
gtk.Action.set_accel_group
().
gtk.Action.connect_accelerator
().
Tous les widgets délégués créés ou connectés à
l'Action
utiliseront le raccourci.
Comme mentionnée précédemment une action à bascule ToggleAction
est une sous-classe d'Action
qui peut être basculée entre deux états.
Le constructeur pour une ToggleAction
prend les mêmes paramètres que
pour une Action
:
toggleaction = gtk.ToggleAction(name
,label
,tooltip
,stock_id
)
En supplément des méthodes pour Action
,
les methodes suivantes pour ToggleAction
:
toggleaction.set_active(is_active
)
is_active = toggleaction.get_active()
... spécifient et récupérent la valeur actuelle de toggleaction
.
Le paramètre is_active
contient une valeur booléenne.
On peut se connecter au signal "toggled" en spécifiant une fonction de rappel qui a la forme :
def toggled_cb(toggleaction
,user_data
)
Le signal "toggled" est émis lorsque le ToggleAction
change d'état.
Le widget délégué MenuItem
d'un
ToggleAction
sera affiché par défaut comme un
CheckMenuItem
. Pour obtenir l'affichage du
MenuItem
comme un RadioMenuItem
,
il faut donner à la propriété "draw-as-radio" la valeur TRUE
par la méthode :
toggleaction.set_draw_as_radio(draw_as_radio
)
On peut utiliser la méthode suivante pour déterminer si les éléments
MenuItem
d'une action ToggleAction
seront affichés comme des RadioMenuItem
:
draw_as_radio = toggleaction.get_draw_as_radio()
Une action exclusive RadioAction
est une sous-classe
d'action ToggleAction
qui peut être groupé de manière
à ce qu'un seul RadioAction
soit actif en même temps.
Les widgets délégués correspondants sont le RadioMenuItem
pour la barre de menu et le RadioToolButton
pour la barre d'outils.
Le constructeur d'un RadioAction
accepte les mêmes
arguments qu'une Action
avec l'ajout d'une valeur
entière unique qui permet d'identifier le RadioAction
actif dans le groupe :
radioaction = gtk.RadioAction(name
,label
,tooltip
,stock_id
,value
)
Le groupe d'un RadioAction
peut être créé par la
méthode :
radioaction.set_group(group
)
... où group
est un autre RadioAction
auquel doit se rattacher le radioaction
. Le groupe
contenant un RadioAction
peut être obtenu par la
méthode :
group = radioaction.get_group()
qui renvoit une liste du groupe d'objets RadioAction
qui inclut le radioaction
.
La valeur de l'élément actuellement actif du groupe peut s'obtenir par la méthode :
active_value = radioaction.get_current_value()
On peut connecter une fonction de rappel au signal "changed" pour être
prévenu lorsque l'élément actif du RadioAction
a
été modifié. Noter qu'il faut se connecter à un seul des objets
RadioAction
pour surveiller les changements. La
fonction de rappel est :
def changed_cb(radioaction
,current
,user_data
)
... où current
est le RadioAction
du groupe qui est actuellement actif.
Le programme exemple actions.py
montre l'utilisation d'objets Action
,
ToggleAction
et RadioAction
.
Figure 16.3, « Exemple avec Actions » illustre le programme en cours de
fonctionnement :
Cet exemple est suffisament proche de basicaction.py, une description détaillée est inutile.
Comme indiqué dans la section précédente, des objets d'Action
apparentés devraient être ajoutés à un groupe d'actions ActionGroup
pour fournir un contrôle commun de leur visibilité et sensibilité.
Par exemple, dans une application de traitement de texte, les éléments de menu et
les boutons de la barre d'outils demandant la justification du texte peuvent être
contenus dans un ActionGroup
. On s'attend à ce qu'une interface
utilisateur possède des objets ActionGroup
multiples
qui couvrent des aspects différents de l'application. Par exemple, les actions globales
comme créer de nouveaux documents, ouvrir et sauvegarder un document ou quitter
l'application forment probablement un ActionGroup
tandis que
des actions telles que modifier la vue du document en formeraient un autre.
On crée un ActionGroup
actiongroup = gtk.ActionGroup(name
)
... où name
est un nom unique
pour l'ActionGroup
. Le nom doit être unique car
il est utilisé lors de la création des raccourcis des objets
Action
qu'il contient.
Le paramètre ActionGroup
peut être obtenu par
la méthode :
name = actiongroup.get_name()
ou en récupérant le contenu de la propriété "name".
Comme on l'a montré dans Section 16.1.1, « Actions », une
Action
préexistante peut être ajoutée à un
ActionGroup
en utilisant une des méthodes :
actiongroup.add_action(action
) actiongroup.add_action_with_accel(action
,accelerator
)
... où le paramètre action
est l'Action
qui doit être ajoutée et le paramètre accelerator
est une
chaîne précisant un raccourci acceptable pour la fonction
gtk.accelerator_parse
(). Si accelerator
vaut None
, l'accélérateur (s'il existe) associé à la
propriété "stock-id" du paramètre action
sera utilisé.
Comme on l'a vu précédemment, il vaut mieux utiliser
la méthode add_action_wih_accel
()
si on souhaite utiliser les raccourcis clavier.
Le groupe ActionGroup
offre trois méthodes
pour faciliter la création et l'ajout d'objets Action
à un groupe ActionGroup
:
actiongroup.add_actions(entries
,user_data
=None) actiongroup.add_toggle_actions(entries
,user_data
=None) actiongroup.add_radio_actions(entries
,value
=0,on_change
=None,user_data
=None)
Le paramètre entries
est une liste de tuples d'entrée d'action
qui fournissent l'information utlisée pour créer les actions ajoutées à
l'ActionGroup
. Le RadioAction
avec la
valeur value
est réglé au départ comme actif. Le paramètre
on_change
représente la fonction de rappel connectée
au signal "changed" du premier RadioAction
du groupe.
La signature de on_changed
est :
def on_changed_cb(radioaction
,current
,user_data
)
Les tuples d'entrées pour les objets Action
contiennent :
None
si l'étiquette est indiquée.None
si l'identificateur de Stock est précisé.gtk.accelerator_parse
(). Optionnel, sa valeur par défaut
est None
.None
.None
Il faut indiquer au minimum une valeur pour le champ name
et une valeur, soit pour l'identificateur stock id
, soit pour
le champ étiquette label
. Si on indique une étiquette,
alors, on peut donner une valeur None
à l'identificateur
de stock si on ne l'utilise pas. Par exemple, la méthode suivant :
actiongroup.add_actions([('quitter', gtk.STOCK_QUIT, '_Quittter moi !', None, 'Quitter le programme', quit_cb)])
ajoute une action à actiongroup
pour quitter
un programme.
Les tuples d'entrée pour les objets ToggleAction
sont
semblables aux tuples d'entrée d'Action
mais il y a un
champ facultatif flag
supplémentaire qui contient une
valeur booléenne indiquant si l'action est active.La valeur par défaut pour le
champ flag
est FALSE
. Par exemple,
la méthode suivante :
actiongroup.add_toggle_actions([('volume, None, '_Volume', '<control>v', 'Niveau de son', mute_cb, True)])
ajoute un ToggleAction
à
l'actiongroup
et l'initialise comme actif.
Les tuples d'entrée pour le RadioAction
sont
semblables à ceux de Action
mais avec un champ
value
à la place du champ callback
:
None
si le label est précisé.None
si l'identificateur de Stock est précisé.gtk.accelerator_parse
(). Optionnel, sa valeur par défaut
vaut None
.None
.None
. Devrait toujours être indiqué dans les applications.
Par exemple le fragment de code suivant :
radioactionlist = [('ma', None, 'M_A', '<control>a', 'Mode MA', 0) ('mf', None, 'M_F', '<control>f', 'Mode MF', 1) ('blu', None, 'B_LU', '<control>b', 'Mode BLU', 2)] actiongroup.add_radio_actions(radioactionlist, 0, changed_cb)
... crée trois objets RadioAction
et fixe l'action
active initiale à 'ma' et la fonction de rappel qui est appelée quand l'une de ces
actions est activée à changed_cb
.
Une Action
peut être retrouvée par son nom à partir
d'un ActionGroup
en utilisant la méthode :
action = actiongroup.get_action(action_name
)
Une liste de tous objets Action
contenus dans un
ActionGroup
peut être recherchée en utilisant la méthode :
actionlist = actiongroup.list_actions()
La sensibilité et la visibilité de tous les objets
Action
d'un ActionGroup
peuvent être controlées en fixant les valeurs de propriété associées.
Les méthodes suivantes récupérent et fixent les propriétés :
is_sensitive = actiongroup.get_sensitive() actiongroup.set_sensitive(sensitive) is_visible = actiongroup.get_visible() actiongroup.set_visible(visible)
Enfin, il est possible de supprimer une Action
d'un ActionGroup
par la méthode :
actiongroup.remove_action(action
)
Le programme d'exemple actiongroup.py
reprend la barre de menu et la barre d'outils du programme
actions.py en utilisant les méthodes
d'ActionGroup
. En outre le programme fournit des boutons
pour controler la sensibilité et la visibilité des éléments du menu et de la
barre d'outils. La Figure 16.4, « Exemple avec ActionGroup » montre le programme
en fonctionnement :
L'application peut surveiller la connexion et le retrait de widgets délégués
aux objets Action
dans un ActionGroup
en utilisant les signaux "connect-proxy" et "disconnect-proxy".
Les fonctions de rappel sont de la forme :
def connect_proxy_cb(actiongroup
,action
,proxy
,user_params
) def disconnect_proxy_cb(actiongroup
,action
,proxy
,user_params
)
Par exemple, on peut vouloir surveiller ces changements pour effectuer quelques modifications supplémentaires aux propriétés du nouveau widget délégué quand il est connecté ou pour mettre à jour quelque autre partie de l'interface utilisateur quand un widget délégué est déconnecté.
Les signaux "pre-activate" and "post-activate" autorisent l'application à réaliser un traitement additionnel juste avant ou après l'activation d'une action. Les fonctions de rappel sont de la forme :
def pre_activate_cb(actiongroup, action, user_params) def post_activate_cb(actiongroup, action, user_params)
Ces signaux sont surtout utilisés par le UIManager
pour fournir une notification globale pour tous les objets Action
des objets ActionGroup
qu'il utilise.