Récupérer la sélection est un processus asynchrone. Pour démarrer le processus, on appelle :
result = widget.selection_convert(selection
,target
,time
=0)
Ceci convertit la sélection selection
au format indiqué
par le paramètre cible target
. La selection
est un atome conforme au type de sélection; les sélections courantes sont les
chaînes de caractères :
PRIMARY SECONDARY
Si c'est possible, le champ temps time
devrait être le moment où se produit l'événement qui a déclenché la sélection.
Cela aide à s'assurer que les événements se produisent dans l'ordre dans lequel
l'utilisateur les a demandés. Cependant, si ce n'est pas disponible (par exemple,
si la conversion a été déclenchée par un signal "clicked"), on peut utiliser
la valeur 0 qui indique l'utilisation du moment actuel. Le paramètre
result
vaut TRUE
si la conversion
réussit, FALSE
dans le cas contraire.
Quand le propriétaire de la sélection répond à la requête, un signal
"selection_received" est envoyé à votre application. Le gestionnaire
de ce signal reçoit un objet gtk.SelectionData
qui posséde les attributs suivants :
selection target type format data
Les paramètres selection
et target
sont les valeurs que l'on a donné dans la méthode
selection_convert
().
Le paramètre type
est un atome qui identifie le
type de données renvoyées par le propriétaire de la sélection. Quelques unes
des valeurs possibles sont "STRING", une chaîne de caractères en latin-1,
"ATOM", une série d'atomes, "INTEGER", un nombre entier, "image/x-xpixmap",
etc. la plupart des cibles ne peuvent renvoyer qu'un seul type.
Voici la liste des atomes standards dans X et GTK+ :
PRIMARY SECONDARY ARC ATOM BITMAP CARDINAL COLORMAP CURSOR CUT_BUFFER0 CUT_BUFFER1 CUT_BUFFER2 CUT_BUFFER3 CUT_BUFFER4 CUT_BUFFER5 CUT_BUFFER6 CUT_BUFFER7 DRAWABLE FONT INTEGER PIXMAP POINT RECTANGLE RESOURCE_MANAGER RGB_COLOR_MAP RGB_BEST_MAP RGB_BLUE_MAP RGB_DEFAULT_MAP RGB_GRAY_MAP RGB_GREEN_MAP RGB_RED_MAP STRING VISUALID WINDOW WM_COMMAND WM_HINTS WM_CLIENT_MACHINE WM_ICON_NAME WM_ICON_SIZE WM_NAME WM_NORMAL_HINTS WM_SIZE_HINTS WM_ZOOM_HINTS MIN_SPACE NORM_SPACE MAX_SPACE END_SPACE, SUPERSCRIPT_X SUPERSCRIPT_Y SUBSCRIPT_X SUBSCRIPT_Y UNDERLINE_POSITION UNDERLINE_THICKNESS STRIKEOUT_ASCENT STRIKEOUT_DESCENT ITALIC_ANGLE X_HEIGHT QUAD_WIDTH WEIGHT POINT_SIZE RESOLUTION COPYRIGHT NOTICE FONT_NAME FAMILY_NAME FULL_NAME CAP_HEIGHT WM_CLASS WM_TRANSIENT_FOR CLIPBOARD
Le paramètre format
fournit la longueur des unités
(par exemple, les caractères) en bits. En général, on ne s'en soucie pas
lorsqu'on reçoit les données.
Le paramètre data
représente les données renvoyées
sous la forme d'une chaîne de caractères.
PyGTK organise toutes les données reçues dans une chaîne de caractères. Ceci rend facile la manipulation des cibles chaînes. Pour récupérer les autres types (par exemple ATOM ou INTEGER), le programme doir extraire l'information de la chaîne renvoyée. PyGTK fournit deux méthodes pour récupérer le texte et une liste de cibles à partir des données de la sélection.
text = selection_data.get_text() targets = selection_data.get_targets()
... où le paramètre text
est une chaîne de caractères
qui contient le texte de la sélection et targets
est une liste des cibles reconnues par la sélection.
Étant donnée une gtk.SelectionData
contenant
une liste de cibles, la méthode :
has_text = selection_data.targets_include_text()
... doit renvoyer TRUE
si une ou plusieurs cibles
peuvent fournir un texte.
Le programme getselection.py illustre la récupération de cibles "STRING" ou "TARGETS" à partir de la sélection primaire et écrit les données correspondantes sur la console quand on clique sur le bouton associé. La Figure 21.1, « Exemple de récupération de sélection » montre un aperçu du programme :
Voici le code du programme getselection.py :
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # exemple getselection.py 4 5 import pygtk 6 pygtk.require('2.0') 7 import gtk 8 9 class GetSelectionExample: 10 # Gestionnaire de signal invoqué quand l'utilisateur 11 # clique sur le bouton "Contenu de la cible" 12 def get_stringtarget(self, widget): 13 # Et demande la cible "STRING" pour la sélection primaire 14 ret = widget.selection_convert("PRIMARY", "STRING") 15 return 16 17 # Gestionnaire de signal invoqué quand l'utilisateur clique sur le bouton "Liste des cibles" 18 def get_targets(self, widget): 19 # Et demande la cible "TARGETS" pour la sélection primaire 20 ret = widget.selection_convert("PRIMARY", "TARGETS") 21 return 22 23 # Gestionnaire de signal appelé quand le propriétaire de la sélection retourne les données 24 def selection_received(self, widget, selection_data, data): 25 # On s'assure que les données sont au bon format 26 if str(selection_data.type) == "STRING": 27 # On affiche la chaîne reçue 28 print "STRING TARGET: %s" % selection_data.get_text() 29 30 elif str(selection_data.type) == "ATOM": 31 # On affiche la liste des cibles que l'on reçoit 32 targets = selection_data.get_targets() 33 for target in targets: 34 name = str(target) 35 if name != None: 36 print "%s" % name 37 else: 38 print "(mauvaise cible)" 39 else: 40 print "La sélection n'est pas un \"STRING\" ou un \"ATOM\" !" 41 42 return False 43 44 45 def __init__(self): 46 # Création de la fenêtre de niveau supérieur 47 window = gtk.Window(gtk.WINDOW_TOPLEVEL) 48 window.set_title("Get Selection") 49 window.set_border_width(10) 50 window.connect("destroy", lambda w: gtk.main_quit()) 51 52 vbox = gtk.VBox(False, 0) 53 window.add(vbox) 54 vbox.show() 55 56 # Création du bouton pour obtenir la contenu chaîne de la cible 57 button = gtk.Button("Contenu de la cible") 58 eventbox = gtk.EventBox() 59 eventbox.add(button) 60 button.connect_object("clicked", self.get_stringtarget, eventbox) 61 eventbox.connect("selection_received", self.selection_received) 62 vbox.pack_start(eventbox) 63 eventbox.show() 64 button.show() 65 66 # Création du bouton pour obtenir les formats de cible acceptés 67 button = gtk.Button("Liste des cibles") 68 eventbox = gtk.EventBox() 69 eventbox.add(button) 70 button.connect_object("clicked", self.get_targets, eventbox) 71 eventbox.connect("selection_received", self.selection_received) 72 vbox.pack_start(eventbox) 73 eventbox.show() 74 button.show() 75 76 window.show() 77 78 def main(): 79 gtk.main() 80 return 0 81 82 if __name__ == "__main__": 83 GetSelectionExample() 84 main()
Les lignes 30-38 se chargent d'obtenir les données de sélection
des "TARGETS" et impriment la liste des noms de cibles. Les boutons sont inclus
dans leur propre boîtes à évènements car une sélection doit être associée
à un gtk.gdkWindow
alors que les boutons sont des
widgets sans fenêtre dans GTK+2.0.