On le voit dans quasiment tous les programmes d'application graphiques, mais quand on veut le faire en Python, on s'aperçoit qu'il n'y a pas beaucoup d'exemples concrets, et on patauge un moment.
Je l'ai appliqué à partir du menu d'une fenêtre Tkinter, qui lance les 3 méthodes: couper, copier et coller.
Sur cette fenêtre, il n'y a que 2 widgets “entry”, l'un appelé “saisie” et l'autre “resultat. Chacun de ces 2 widgets peut avoir le focus.
Et, bien sûr, ça fonctionne sous Windows et sous Linux!
Voici le code. Il est auto-documenté:
def couper(self): # effacer l'éventuel contenu précédent du clipboard self.clipboard_clear() # sélectionner le widget qui a le focus et agir selon if self.focus_get()==self.saisie: try: # saisir le texte sélectionné 's' s'il y en a un a=self.saisie.index(Tkinter.ANCHOR) i=self.saisie.index(Tkinter.INSERT) # si la sélection a été faites à l'envers, inverser a et i if i<a: a,i=i,a t = self.saisie.get() s = t[a:i] # remettre le texte dont on a retiré la sélection t = t[0:a] + t[i:] self.saisie.delete(0,Tkinter.END) self.saisie.insert(0, t) # mettre le curseur à l'endroit où il y avait la sélection self.saisie.icursor(a) # et envoyer le texte sélectionné dans le clipboard self.clipboard_append(s) except: pass elif self.focus_get()==self.resultat: try: # saisir le texte sélectionné 's' s'il y en a un a=self.resultat.index(Tkinter.ANCHOR) i=self.resultat.index(Tkinter.INSERT) # si la sélection a été faites à l'envers, inverser a et i if i<a: a,i=i,a t = self.resultat.get() s = t[a:i] # remettre le texte dont on a retiré la sélection t = t[0:a] + t[i:] self.resultat.delete(0,Tkinter.END) self.resultat.insert(0, t) # mettre le curseur à l'endroit où il y avait la sélection self.resultat.icursor(a) # et envoyer le texte sélectionné dans le clipboard self.clipboard_append(s) except: pass else: pass
def copier(self): # effacer l'éventuel contenu précédent du clipboard self.clipboard_clear() try: # saisir la sélection s'il y en a une (sinon -> except) t = self.selection_get() # et envoyer le texte sélectionné dans le clipboard self.clipboard_append(t) except: pass
def coller(self): try: # trouver la sélection du clipboard t = self.selection_get(selection='CLIPBOARD') # selon le widget qui a le focus, mettre la sélection au bon endroit if self.focus_get()==self.saisie: self.saisie.insert(Tkinter.INSERT, t) elif self.focus_get()==self.resultat: self.resultat.insert(Tkinter.INSERT, t) else: pass except: pass