232 votes

Comment copier une chaîne de caractères dans le presse-papiers ?

J'essaie de créer une application Windows de base qui construit une chaîne de caractères à partir de la saisie de l'utilisateur, puis l'ajoute au presse-papiers. Comment copier une chaîne de caractères dans le presse-papiers en utilisant Python ?

4 votes

En rapport avec cette question .

0 votes

Jaraco.clipboard le fait (aussi) : clipboard.copy(variable)

0 votes

Voir aussi mon réponse à une question connexe sur la copie vers le presse-papiers à l'aide de Tkinter sans afficher une fenêtre. Il comprend une fonction Python qui remplace/renvoie le texte du presse-papiers en utilisant Tkinter.

337voto

atomizer Points 1502

En fait, pywin32 y ctypes semble être une surcharge pour cette simple tâche. Tkinter est un cadre d'interface graphique multiplateforme, livré par défaut avec Python et doté de méthodes d'accès au presse-papiers et d'autres fonctionnalités intéressantes.

Si tout ce dont vous avez besoin est de mettre du texte dans le presse-papiers du système, ceci le fera :

from Tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('i can has clipboardz?')
r.update() # now it stays on the clipboard after the window is closed
r.destroy()

Et c'est tout, pas besoin de s'embêter avec des bibliothèques tierces spécifiques à une plate-forme.

Si vous utilisez Python 3, remplacez TKinter avec tkinter .

61 votes

Récupérer le contenu du presse-papiers : result = r.selection_get(selection = "CLIPBOARD")

37 votes

@SurDin Tkinter a été renommé tkinter dans python 3, donc cela dépend de la version que vous utilisez.

1 votes

C'est une bonne solution, mais j'ai des problèmes avec les chaînes Unicode. Connaissez-vous des solutions de contournement (par exemple, convertir les caractères Unicode en un équivalent ascii) ?

92voto

user1227883 Points 291

Je n'avais pas de solution, juste une solution de contournement.

À partir de Windows Vista, une commande intégrée appelée clip qui prend la sortie d'une commande de la ligne de commande et la met dans le presse-papiers. Par exemple, ipconfig | clip .

J'ai donc créé une fonction avec le os qui prend une chaîne et l'ajoute au presse-papiers en utilisant la solution intégrée de Windows.

import os
def addToClipBoard(text):
    command = 'echo ' + text.strip() + '| clip'
    os.system(command)

# Example
addToClipBoard('penny lane')

# Penny Lane is now in your ears, eyes, and clipboard.

Comme indiqué précédemment dans les commentaires, l'un des inconvénients de cette approche est que la echo ajoute automatiquement une nouvelle ligne à la fin de votre texte. Pour éviter cela, vous pouvez utiliser une version modifiée de la commande :

def addToClipBoard(text):
    command = 'echo | set /p nul=' + text.strip() + '| clip'
    os.system(command)

Si vous utilisez Windows XP, il vous suffira de suivre les étapes décrites dans le guide de l'utilisateur. Copier et coller directement dans le Presse-papiers à partir de l'invite de commande de Windows XP Pro .

0 votes

Y a-t-il des limites à la longueur du texte ?

28 votes

Que se passe-t-il si text contient | calc.exe ?

2 votes

@WilliBallenthin alors vous devez le mettre entre guillemets. Mais que faire s'il CONTIENT des guillemets doubles ? Alors vous devez doubler les guillemets doubles. text with " quotes and | pipe devient "text with "" quotes and | pipe" Bien que cela puisse poser des problèmes sur les systèmes avec des Windows plus anciens que 95.

48voto

pongo Points 61

Vous pouvez utiliser pyperclip - module de presse-papiers multiplateforme. Ou Xerox - module similaire, sauf qu'il nécessite le module Python win32 pour fonctionner sous Windows.

0 votes

pyperclip ne fait pas Unicode sur Windows. win32clipboard fait.

15 votes

Mon pyperclip Le patch a été accepté ; c:\python34\Scripts\pip install --upgrade pyperclip pour gérer le texte Unicode.

1 votes

Il m'a fallu du temps pour découvrir que c'est pyperclip no paperclip . De plus, comme sur 2016, pyperclip fonctionne aussi avec les caractères Unicode. J'ai testé les caractères ±°©©åäö pour fonctionner sur Win10 64-bit, avec Python 3.5 et pyperclip 1.5.27.

43voto

kapace Points 311

Vous pouvez également utiliser ctypes pour exploiter l'API Windows et éviter l'énorme paquet pywin32. Voici ce que j'utilise (excusez la pauvreté du style, mais l'idée est là) :

import ctypes

# Get required functions, strcpy..
strcpy = ctypes.cdll.msvcrt.strcpy
ocb = ctypes.windll.user32.OpenClipboard    # Basic clipboard functions
ecb = ctypes.windll.user32.EmptyClipboard
gcd = ctypes.windll.user32.GetClipboardData
scd = ctypes.windll.user32.SetClipboardData
ccb = ctypes.windll.user32.CloseClipboard
ga = ctypes.windll.kernel32.GlobalAlloc    # Global memory allocation
gl = ctypes.windll.kernel32.GlobalLock     # Global memory Locking
gul = ctypes.windll.kernel32.GlobalUnlock
GMEM_DDESHARE = 0x2000

def Get():
  ocb(None) # Open Clip, Default task

  pcontents = gcd(1) # 1 means CF_TEXT.. too lazy to get the token thingy...

  data = ctypes.c_char_p(pcontents).value

  #gul(pcontents) ?
  ccb()

  return data

def Paste(data):
  ocb(None) # Open Clip, Default task

  ecb()

  hCd = ga(GMEM_DDESHARE, len(bytes(data,"ascii")) + 1)

  pchData = gl(hCd)

  strcpy(ctypes.c_char_p(pchData), bytes(data, "ascii"))

  gul(hCd)

  scd(1, hCd)

  ccb()

5 votes

Au moins dans python 2.6 x64, j'ai dû modifier bytes(data,"ascii") a bytes(data) . Merci d'avoir répondu à la question, je ne peux pas utiliser pywin32 ou tk ou un certain nombre d'autres choses et cela fonctionne.

1 votes

Pas de soucis, mais notez que les données renvoyées par le presse-papiers sont en fait dans un autre encodage, je crois que c'est le CP-1252 de Windows. C'est un peu bricolé, mais si vous n'utilisez pas l'encodage correct, les caractères non ASCII provoqueront une erreur ou seront mal décodés.

0 votes

Les noms de variables ne doivent pas être commentés et tout doit être compatible avec Unicode.

9voto

jcoon Points 5693

Il semble que vous deviez ajouter win32clipboard à vos paquets de sites. Il fait partie du paquet pywin32

2 votes

Serait une bien meilleure réponse avec un exemple de code.

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