Comment lire le texte du presse-papiers (Windows) à partir de python?
Comment lire le texte du presse-papiers (Windows) à partir de python?
Réponses:
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 obtient:
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. Cela permet à d'autres fenêtres d'accéder au presse-papiers. Ne placez pas d'objet dans le presse-papiers après avoir appelé CloseClipboard.
vous pouvez facilement le faire via le module intégré Tkinter qui est essentiellement une bibliothèque GUI. Ce code crée un widget vide pour obtenir le contenu du presse-papiers du système d'exploitation.
#from tkinter import Tk # Python 3
from Tkinter import Tk
Tk().clipboard_get()
tkinter
au lieu de Tkinter
. Sinon, cela ne fonctionnait pas sur mon python 3.7.3 64bit win10.
J'ai vu de nombreuses suggestions pour utiliser le module win32, mais Tkinter fournit la méthode la plus courte et la plus simple que j'ai vue, comme dans cet article: Comment copier une chaîne dans le presse-papiers sous Windows en utilisant Python?
De plus, Tkinter est dans la bibliothèque standard de python.
Si vous ne souhaitez pas installer de packages supplémentaires, vous ctypes
pouvez également 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())
J'ai découvert que c'était le moyen le plus simple d'accéder au presse-papiers à partir de python:
1) Installez pyperclip:
pip install pyperclip
2) utilisation:
import pyperclip
s = pyperclip.paste()
pyperclip.copy(s)
# the type of s is string
Testé sur Win10 64 bits, Python 3.5 et Python 3.7.3 (64 bits). Semble également fonctionner avec des caractères non ASCII. Les caractères testés incluent ± ° © © αβγθΔΨΦåäö
La réponse la plus votée ci-dessus est étrange dans la mesure où elle efface simplement le presse-papiers puis obtient le contenu (qui est alors vide). On pourrait effacer le presse-papiers pour être sûr que certains types de contenu de presse-papiers comme «texte formaté» ne «couvrent» pas le contenu de texte brut que vous souhaitez enregistrer dans le presse-papiers.
Le morceau de code suivant remplace toutes les nouvelles lignes dans le presse-papiers par des espaces, puis supprime tous les espaces doubles et enregistre enfin 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()
La bibliothèque standard python le fait ...
try:
# Python3
import tkinter as tk
except ImportError:
# Python2
import Tkinter as tk
def getClipboardText():
root = tk.Tk()
# keep the window from showing
root.withdraw()
return root.clipboard_get()
Essayez win32clipboard du package win32all (qui est probablement installé si vous êtes sur ActiveState Python).
Voir l'exemple ici: http://code.activestate.com/recipes/474121/
Pour mon programme de console, les réponses avec tkinter ci-dessus ne fonctionnaient pas tout à fait pour moi car le .destroy () donnait toujours une erreur ,:
impossible d'appeler la commande "event": l'application a été détruite lors de l'exécution ...
ou lors de l'utilisation de .withdraw (), la fenêtre de la console n'a pas récupéré le focus.
Pour résoudre ce problème, vous devez également appeler .update () avant le .destroy (). Exemple:
# Python 3
import tkinter
r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()
Le r.withdraw () empêche le cadre de s'afficher pendant un milliseconde, puis il sera détruit en renvoyant le focus à la console.
Utiliser le presse-papiers de la bibliothèque Pythons
Il est simplement utilisé comme ceci:
import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()
from pyperclip import copy, paste
.