137 votes

Comment lire du texte à partir du presse-papiers ?

Comment lire du texte à partir du presse-papiers (Windows) avec python ?

4 votes

En rapport avec cette question .

0 votes

Dans mon cas, seulement dan réponse travaillée, qui utilise presse-papiers paquet.

136voto

Sakin Points 1134

Vous pouvez utiliser le module appelé win32clipboard qui fait partie de pywin32 .

Voici un exemple qui définit d'abord les données du presse-papiers puis les récupère :

import win32clipboard

# set clipboard data
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText('testing 123')
win32clipboard.CloseClipboard()

# get clipboard data
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
print data

Un rappel important de la documentation :

Lorsque la fenêtre a fini d'examiner ou de modifier le presse-papiers, fermez le presse-papiers en appelant CloseClipboard. Ceci permet aux autres fenêtres d'accéder au presse-papiers. Ne placez pas d'objet sur le presse-papiers après avoir appelé CloseClipboard.

7 votes

Savez-vous s'il existe un moyen d'utiliser l'instruction "avec" ?

4 votes

Il convient de noter que dans py34, win7, SetClipboardText ne fonctionne pas sans un appel préalable à EmptyClipboard.

0 votes

Ce module est utile si vous souhaitez effectuer des opérations plus complexes, par exemple récupérer le contenu formaté en HTML dans le presse-papiers. Voir stackoverflow.com/questions/17298897/

72voto

kmonsoor Points 259

Vous pouvez facilement réaliser cette opération grâce au module intégré Tkinter qui est essentiellement une bibliothèque GUI. Ce code crée un widget vide pour récupérer le contenu du presse-papiers de l'OS.

from tkinter import Tk  # Python 3
#from Tkinter import Tk # for Python 2.x
Tk().clipboard_get()

3 votes

Veuillez ajouter des commentaires sur ce code, et (éventuellement) des liens vers la documentation correspondante.

8 votes

Devrait être tkinter au lieu de Tkinter . Par contre, il ne fonctionne pas sur mon python 3.7.3 64bit win10.

3 votes

C'est bien mieux que d'essayer d'obtenir pywin32 installé, car il a une série de problèmes connus. Bon conseil sur la différence de boîtier, c'était difficile à comprendre au début.

24voto

kichik Points 7249

Si vous ne voulez pas installer de paquets supplémentaires, ctypes peut aussi bien faire le travail.

import ctypes

CF_TEXT = 1

kernel32 = ctypes.windll.kernel32
kernel32.GlobalLock.argtypes = [ctypes.c_void_p]
kernel32.GlobalLock.restype = ctypes.c_void_p
kernel32.GlobalUnlock.argtypes = [ctypes.c_void_p]
user32 = ctypes.windll.user32
user32.GetClipboardData.restype = ctypes.c_void_p

def get_clipboard_text():
    user32.OpenClipboard(0)
    try:
        if user32.IsClipboardFormatAvailable(CF_TEXT):
            data = user32.GetClipboardData(CF_TEXT)
            data_locked = kernel32.GlobalLock(data)
            text = ctypes.c_char_p(data_locked)
            value = text.value
            kernel32.GlobalUnlock(data_locked)
            return value
    finally:
        user32.CloseClipboard()

print(get_clipboard_text())

0 votes

Cela ne semble pas fonctionner sous Windows 10. Il imprime toujours "Aucun".

0 votes

Windows 10 a bien fonctionné pour moi tant que j'ai utilisé Python 32 bits. J'ai mis à jour la réponse pour qu'elle fonctionne également avec 64 bits.

0 votes

Je reçois cette erreur "expected char pointer, got int" sur la ligne "text = ctypes.c_char_p(data_locked)", une idée ?

23voto

Buttons840 Points 1656

J'ai vu de nombreuses suggestions pour utiliser le module win32, mais Tkinter fournit la méthode la plus courte et la plus facile que j'ai vue, comme dans ce post : Comment copier une chaîne de caractères dans le presse-papiers sous Windows en utilisant Python ?

De plus, Tkinter fait partie de la bibliothèque standard de Python.

3 votes

Un peu de code qui va récupérer la valeur du presse-papiers via Tkinter : from Tkinter import Tk [ \nl ] r = Tk() [ \nl ] result = r.selection_get(selection = "CLIPBOARD") [ \nl ] r.destroy()

0 votes

C'est certes facile, mais cela peut changer momentanément le focus de la fenêtre et provoquer un scintillement de la fenêtre. Cela vaut probablement la peine de coder pour win32clipboard s'il est disponible, et de revenir à Tkinter dans le cas contraire.

13voto

born Points 273

La réponse la plus votée ci-dessus est bizarre dans le sens où elle efface simplement le Presse-papiers et récupère ensuite le contenu (qui est alors vide). On pourrait effacer le presse-papiers pour s'assurer qu'un type de contenu du presse-papiers comme "texte formaté" ne "couvre" pas le contenu en texte brut que vous voulez enregistrer dans le presse-papiers.

Le morceau de code suivant remplace toutes les nouvelles lignes du presse-papiers par des espaces, puis supprime tous les espaces doubles et enfin enregistre le contenu dans le presse-papiers :

import win32clipboard

win32clipboard.OpenClipboard()
c = win32clipboard.GetClipboardData()
win32clipboard.EmptyClipboard()
c = c.replace('\n', ' ')
c = c.replace('\r', ' ')
while c.find('  ') != -1:
    c = c.replace('  ', ' ')
win32clipboard.SetClipboardText(c)
win32clipboard.CloseClipboard()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X