Table des matières
L'objet Clipboard a été ajouté en PyGTK 2.2. Le
GtkClipboard était disponible en GTK+ 2.0 mais
n'était pas utilisé par PyGTK 2.0 car il n'était pas un
GObject complet. Quelques nouveaux objets ont été ajoutés
au module gtk.gdk de PyGTK 2.2 mais ils ne seront pas décrits dans ce tutoriel.
Lisez le PyGTK 2
Reference Manual pour obtenir des informations sur les objets
gtk.gdk.Display,
gtk.gdk.DisplayManager et
gtk.gdk.Screen
Un Clipboard fournit une zone de stockage pour partager
des données entre processus ou entre différents widgets du même
processus. Chaque Clipboard est identifié par un nom
encodé en tant que gdk.Atom. On peut utiliser n'importe
quel nom souhaité pour identifier un Clipboard, celui-ci
sera créé s'il n'existe pas. Si on souhaite partager un Clipboard
avec d'autres processus, chaque processus doit connaître le nom du
Clipboard.
Les Clipboard sont construits à partir des
SelectionData et des interfaces de sélection. Le
Clipboard par défaut utilisé par les widgets
TextView, Label et
Entry se nomme "CLIPBOARD". Les autres clipboards
courants sont "PRIMARY" et "SECONDARY", ce qui correspond aux sélections
primaires et secondaires (inconnues de Win32). Elles peuvent aussi être
désignées par les objets gtk.gdk.Atom :
gtk.gdk.SELECTION_CLIPBOARD,
gtk.gdk.SELECTION_PRIMARY et
gtk.gdk.SELECTION_SECONDARY. Se reporter à la
documentation de référence gtk.gdk.Atom pour plus d'information.
Un Clipboard est créé par le
constructeur :
presse_papier = gtk.Clipboard(display,selection)
...où display est le gtk.gdk.Display
associé avec le Clipboard désigné par le paramètre
selection.
La fonction suivante crée un Clipboard en utilisant le
gtk.gdk.Display par défaut :
presse_papier = gtk.clipboard_get(selection)
Enfin, un Clipboard peut aussi être créé par la
méthode Widget :
presse_papier = widget.get_clipboard(selection)
Le widget doit être "réalisé" et appartenir à la hiérarchie de la fenêtre racine.
Les widgets Entry, SpinButton
et TextView possèdent des menus contextuels qui offrent la
possibilité de couper ou copier le texte sélectionné et de le coller à partir
du presse-papier "CLIPBOARD". De plus, des liens sont établis
pour permettre des raccourcis clavier pour couper, copier et coller.
Couper est activé par Control+X ,
copier par Control+C et
coller par Control+V.
Les widgets (Entry et
SpinButton) mettent en oeuvre l'interface
Editable qui possède les méthodes suivantes pour
couper, copier et coller de et vers le "CLIPBOARD" clipboard :
editable.cut_clipboard() editable.copy_clipboard() editable.paste_clipboard()
Un Label sélectionnable (la propriété "selectable"
vaut TRUE) permet aussi de copier le texte dans le
presse-papier "CLIPBOARD"
Les TextBuffer ont des méthodes similaires bien qu'ils
permettent aussi de préciser le presse-papier à utiliser :
textbuffer.copy_clipboard(clipboard)
Le texte sélectionné sera copié dans le Clipboard
indiqué par clipboard.
textbuffer.cut_clipboard(clipboard,default_editable)
Le texte sélectionné sera copié dans clipboard.
Si le paramètre default_editable vaut
TRUE, le texte sélectionné sera aussi effacé du
TextBuffer. Sinon, la methode
cut_clipboard() fonctionnera comme la méthode
copy_clipboard() .
textbuffer.paste_clipboard(clipboard,override_location,default_editable)
Si le paramètre default_editable vaut
TRUE,
le contenu de clipboard sera inséré dans le
TextBuffer à l'endroit indiqué par le paramètre
override_location du TextIter
default_editable vaut FALSE,
la méthode paste_clipboard() n'insèrera pas le
contenu de clipboard. Si le paramètre
override_location vaut None, le contenu de
clipboard sera inséré à l'emplacement du curseur.
Les TextBuffer possèdent aussi deux méthodes
pour gérer un ensemble de Clipboard qui sont automatiquement
affectés avec le contenu de la sélection en cours :
textbuffer.add_selection_clipboard(clipboard) textbuffer.remove_selection_clipboard(clipboard)
Quand un TextBuffer est ajouté à un
TextView, le presse-papiers "PRIMARY" est automatiquement
ajouté aux presse-papiers choisis. L'application peut ajouter d'autres presse-papiers,
(par exemple le presse-papier "CLIPBOARD").
Il est possible d'affecter des données au Clipboard
par programme en utilisant l'une de ces méthodes :
presse_papier.set_with_data(cibles,get_func,clear_func,donnees_utilisateur) presse_papier.set_text(text,len=-1)
La méthode set_with_data() indique quelles cibles de
données sélectionnées sont acceptées et fournit les fonctions
(get_func et clear_func) qui
sont appelées quand les données sont appelées ou quand les données du presse-papiers
sont modifiées. Le paramètre donnees_utilisateur est transmis
à get_func où à clear_func
quand elles sont appelées. Le paramètre cibles est une
liste de 3-tuples contenant :
Les paramètres de get_func et de
clear_func sont :
def get_func(presse_papier, donnees_selection, info, data): def clear_func(presse_papier, data):
...où le paramètre presse_papier est le
Clipboard, le paramètre donnees_selection
est un objet SelectionData contenant les données, le paramètre
info est l'entier assigné à l'application, associé à une cible
et le paramètre data représente les données utilisateur.
La méthode set_text() est une méthode commode
qui utilise la méthode set_with_data() pour
placer les données texte dans un Clipboard avec pour
cibles : "STRING", "TEXT", "COMPOUND_TEXT", et "UTF8_STRING". Elle utilise
les fonctions internes get et clear pour gérer les données. Cette méthode
est équivalente à :
def my_set_text(self, texte, len=-1):
targets = [ ("STRING", 0, 0),
("TEXT", 0, 1),
("COMPOUND_TEXT", 0, 2),
("UTF8_STRING", 0, 3) ]
def text_get_func(presse_papier, donnees_selection, info, data):
selection.set_text(data)
return
def text_clear_func(presse_papier, data):
del data
return
self.set_with_data(cibles, text_get_func, text_clear_func, texte)
return
Une fois les données placées dans le presse-papiers, elles demeurent disponibles jusqu'à la fermeture de l'application ou jusqu'à leur remplacement.
Pour obtenir le comportement habituel du couper dans un presse-papiers, l'application doit supprimer le texte ou l'objet sélectionné après l'avoir recopié dans le presse-papiers.
Le contenu du Clipboard peut être récupéré
avec la méthode suivante :
clipboard.request_contents(target,callback,user_data=None)
Les contenus indiqués par target sont récupérés de
manière asynchrone dans la fonction indiquée par le paramètre
callback qui est appelé avec user_data.
le paramètre callback a la forme :
def callback(presse_papier, donnees_selection, data):
... où donnees_selection est un objet SelectionData
conservant le contenu du presse_papier. data
contient les données utilisateur. La méthode request_contents()
est la façon la plus commune de récupérer le contenu d'un Clipboard.
La méthode suivante est commode pour retrouver le contenu texte d'un Clipboard :
clipboard.request_text(callback,user_data=None)
La chaîne texte est renvoyée à la fonction de rappel à la place d'un objet
Selectiondata. Vous pouvez vérifier quelles cibles sont
disponibles sur le Clipboard en employant la méthode :
clipboard.request_targets(callback,user_data=None)
Les cibles sont retournées à la fonction de rappel comme un tuple d'objets
gtk.gdk.Atom.
Deux méthodes pratiques sont fournies pour renvoyer le contenu du
Clipboard de manière synchrone :
donnees_selection = clipboard.wait_for_contents(cible) texte = clipboard.wait_for_text()
Pour illustrer l'utilisation d'un Clipboard, le programme
clipboard.py récupère les éléments de texte
qui sont coupés ou copiés vers le presse-papiers "CLIPBOARD" et sauvegarde les dix
dernières entrées du presse-papiers. Il y a dix boutons qui permettent d'accéder
au texte des entrées sauvegardées. Le texte du bouton affiche les seize premiers
caractères du texte sauvé et les infobulles montrent les cibles que la zone de texte avait à l'origine.
Quand on clique sur un bouton d'entrée, le texte sauvegardé associé s'inscrit
dans la fenêtre de texte ; il est modifiable. Le bouton sous la fenêtre de texte sauvegarde
le contenu actuel de la fenêtre dans le presse-papiers.
Figure 15.1, « Exemple de Clipboard » montre le programme clipboard.py en action :
Le programme d'exemple sonde le presse-papiers toutes les 1,5 secondes pour voir
si le contenu a changé. Le programme peut être modifié pour dupliquer la totalité
de contenu de cible et prendre le contrôle en employant la méthode
set_with_data(). Plus tard, quand un autre programme
place du contenu dans le presse-papiers, le paramètre clear_func sera
appelé , il pourra être utilisé pour recharger le contenu du presse-papiers et en
reprendre le contrôle .