2008-09-19 13 views
58

¿Cómo leo texto desde el portapapeles (windows) de python?¿Cómo leo el texto del portapapeles (windows) de python?

+1

Relacionados con [esta pregunta] (http://stackoverflow.com/q/579687/296974). – glglgl

+0

en mi caso, solo [dan] (http://stackoverflow.com/users/2084578/dan) respuesta funcionó, que usa [portapapeles] (https://pypi.python.org/pypi/clipboard/0.0.4) paquete. – Soorena

Respuesta

66

Puede utilizar el módulo llamado win32clipboard, que es parte de pywin32.

Aquí es un ejemplo que primero establece los datos del portapapeles y luego lo consigue:

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 recordatorio importante de la documentación:

Cuando la ventana ha terminado de examinar o cambiar el portapapeles, cierra el portapapeles llamando a CloseClipboard. Esto permite que otras ventanas accedan al portapapeles. No coloque un objeto en el portapapeles después de llamar a CloseClipboard.

+3

¿Sabes si hay una forma de usar la instrucción 'with '? – Norfeldt

+3

Merece la pena señalar, en py34, win7, SetClipboardText no funcionó sin una llamada anterior a EmptyClipboard – CoderTao

+0

Este módulo es útil si desea realizar operaciones más complejas, p. obtener el contenido con formato HTML fuera del portapapeles. Consulte http://stackoverflow.com/questions/17298897/how-can-i-copy-from-an-html-file-to-the-clipboard-in-python-in-formatted-text –

19

he visto muchas sugerencias para utilizar el módulo Win32, pero Tkinter proporciona el método más fácil y más corto que he visto, como en este post: How do I copy a string to the clipboard on Windows using Python?

Plus, Tkinter está en la biblioteca estándar de Python .

+3

Algún código que obtendrá el valor portapapeles través Tkinter: de Tkinter importación Tk [\ nl] r = Tk() [\ nl] resultado = r.selection_get (selección = "cLIPBOARD") [\ nl] r.destroy() – mgkrebbs

11

La respuesta más votada arriba es extraña de una manera que simplemente borra el Portapapeles y luego obtiene el contenido (que entonces está vacío). Se podría borrar el portapapeles para asegurarse de que cierto tipo de contenido del portapapeles, como "texto formateado", no "cubra" el contenido de texto sin formato que desea guardar en el portapapeles.

El siguiente fragmento de código sustituye a todos los saltos de línea en el portapapeles por espacios, a continuación, elimina todos los espacios dobles y finalmente guarda el contenido nuevamente en el portapapeles:

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() 
9

Si no desea instalar paquetes adicionales , ctypes puede hacer el trabajo también.

import ctypes 

CF_TEXT = 1 

kernel32 = ctypes.windll.kernel32 
user32 = ctypes.windll.user32 

user32.OpenClipboard(0) 
if user32.IsClipboardFormatAvailable(CF_TEXT): 
    data = user32.GetClipboardData(CF_TEXT) 
    data_locked = kernel32.GlobalLock(data) 
    text = ctypes.c_char_p(data_locked) 
    print(text.value) 
    kernel32.GlobalUnlock(data_locked) 
else: 
    print('no text in clipboard') 
user32.CloseClipboard() 
18

fácilmente puede hacer esto a través del módulo integrado Tkinter que es básicamente una biblioteca de interfaz gráfica de usuario. Este código crea un widget en blanco para obtener el contenido del portapapeles del sistema operativo.

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

favor agregar comentario a este código, y (posiblemente) enlaces a la documentación de revelant. –

+0

@jb. hecho :) gracias por la nota – kmonsoor

2

Por mi programa de consola las respuestas con tkinter anterior hicieron el trabajo no es para mí porque el .destroy() siempre dio un error ,:

comando

no puede invocar "evento" : la aplicación se ha destruido al ejecutar ...

o al utilizar .withdraw() la ventana de la consola no recuperó el foco.

Para resolver esto, también debe llamar .update() antes del .destroy().Ejemplo:

# Python 3 
import tkinter 

r = tkinter.Tk() 
text = r.clipboard_get() 
r.withdraw() 
r.update() 
r.destroy() 

El r.withdraw() impide que el marco de muestra para un milisegundo, y luego será destruida dando el foco de nuevo a la consola.

2

Use pitones biblioteca Clipboard

Su simplemente utilizados como esto:

import clipboard 
clipboard.copy("this text is now in the clipboard") 
print clipboard.paste() 
+0

los otros no funcionaron, gracias. – Soorena

+0

Esto es esencialmente usando pyperclip. El código fuente completo de este módulo es literalmente: 'from pyperclip import copy, paste'. – pbreach

1

descubrí esta era la forma más fácil de obtener acceso al portapapeles de pitón:

1) Instalar pyperclip : pip install pyperclip

2) Uso:

import pyperclip 

s = pyperclip.paste() 
pyperclip.copy(s) 

# the type of s is string 

Probado en Win10 de 64 bits, Python 3.5. Parece que también funciona con caracteres que no son ASCII. Los caracteres probados incluyen ± ° ©© αβγθΔΨΦåäö

Cuestiones relacionadas