IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Apprendre à utiliser le module Python PyGTK 2.0


précédentsommairesuivant

XV. Chapitre 15. Nouveaux Widgets dans PyGTK 2.2

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.

XV-A. Les Clipboards

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 Clipboard 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.

XV-A-1. Créer un Clipboard

Un Clipboard est créé par le constructeur :

 
Sélectionnez
  presse_papier = gtk.Clipboard(display, selection)

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 :

 
Sélectionnez
  presse_papier = gtk.clipboard_get(selection)

Enfin, un Clipboard peut aussi être créé par la méthode Widget :

 
Sélectionnez
  presse_papier = widget.get_clipboard(selection)

Le widget doit être "réalisé" et appartenir à la hiérarchie de la fenêtre racine.

XV-A-2. Utiliser les Clipboard avec les Entry, Spinbutton et TextView

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 œuvre l'interface Editable qui possède les méthodes suivantes pour couper, copier et coller de et vers le "CLIPBOARD" clipboard :

 
Sélectionnez
1.
2.
3.
  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" en utilisant un menu contextuel ou le raccourci-clavier Control+C.

Les TextBuffer ont des méthodes similaires bien qu'ils permettent aussi de préciser le presse-papier à utiliser :

 
Sélectionnez
  textbuffer.copy_clipboard(clipboard)

Le texte sélectionné sera copié dans le Clipboard indiqué par clipboard.

 
Sélectionnez
  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 méthode cut_clipboard() fonctionnera comme la méthode copy_clipboard() .

 
Sélectionnez
  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.

Si 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ées avec le contenu de la sélection en cours :

 
Sélectionnez
  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").

XV-A-3. Affecter des données à un Clipboard

Il est possible d'affecter des données au Clipboard par programme en utilisant l'une de ces méthodes :

 
Sélectionnez
1.
2.
3.
  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 le sont également 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 :

  • une chaine représentant une cible acceptée par le presse-papiers ;
  • une valeur de drapeau utilisée pour le glisser/déposer - on utilise 0 ;
  • un entier affecté à l'application qui est transmis comme paramètre au gestionnaire de signal pour aider à identifier le type de cible.

Les paramètres de get_func et de clear_func sont :

 
Sélectionnez
1.
2.
3.
  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 à :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  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.

XV-A-4. Récupérer le contenu du Clipboard

Le contenu du Clipboard peut être récupéré avec la méthode suivante :

 
Sélectionnez
  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 :

 
Sélectionnez
  def callback(presse_papier, donnees_selection, data):

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 :

 
Sélectionnez
  clipboard.request_text(callback, user_data=None)

La chaine 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 :

 
Sélectionnez
  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 :

 
Sélectionnez
1.
2.
3.
  donnees_selection = clipboard.wait_for_contents(cible)

  texte = clipboard.wait_for_text()

XV-A-5. Exemple de Clipboard

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 :

Image non disponible
Figure 15.1. Exemple de Clipboard

Le programme d'exemple sonde le presse-papiers toutes les 1,5 seconde pour voir si le contenu a changé. Le programme peut être modifié pour dupliquer la totalité de contenu ciblé 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 .


précédentsommairesuivant

Copyright © 2005 John Finlay. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.