Вопрос по python, windows – Как мне прочитать текст из буфера обмена (windows) из python?

71

Как мне прочитать текст из буфера обмена (windows) из python?

в моем случае толькоdan ответ сработал, который используетclipboard пакет. Soorena
Относится кthis question. glglgl

Ваш Ответ

10   ответов
3

вероятно, установлен, если вы используете ActiveState Python).

Смотрите образец здесь:http://code.activestate.com/recipes/474121/

11

ctypes можно сделать работу, а также.

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())
Windows 10 работала нормально для меня, пока я использовал 32-битный Python. Я обновил ответ, чтобы работать и с 64-битной версией.
Похоже, что это не работает в Windows 10. Он всегда печатает "Нет".
22

Tkinter которая в основном библиотека GUI. Этот код создает пустой виджет для получения содержимого буфера обмена из ОС.

#from tkinter import Tk  # Python 3
from Tkinter import Tk
Tk().clipboard_get()
@jb. сделано :) спасибо за примечание
Пожалуйста, добавьте комментарий к этому коду и (возможно) ссылки на соответствующую документацию.
2

буфер обмена

Его просто используют так:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  
По сути это использование Pyperclip. Весь исходный код этого модуля буквально:from pyperclip import copy, paste.
другие не сработали, спасибо.
11

ысле, что он просто очищает буфер обмена и затем получает содержимое (которое затем пусто). Можно очистить буфер обмена, чтобы быть уверенным, что некоторый тип содержимого буфера обмена, такой как «форматированный текст» не "прикрывает" ваш текстовый контент, который вы хотите сохранить в буфер обмена.

Следующий фрагмент кода заменяет все новые строки в буфере обмена пробелами, затем удаляет все двойные пробелы и, наконец, сохраняет содержимое обратно в буфер обмена:

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

try:
    # Python2
    import Tkinter as tk
except ImportError:
    # Python3
    import tkinter as tk

def getClipboardText():
    root = tk.Tk()
    # keep the window from showing
    root.withdraw()
    return root.clipboard_get()
Именно то, что мне нужно, и встроено тоже! Спасибо!
19

но Tkinter предоставляет самый короткий и простой способ, который я видел, как в этом посте:Как скопировать строку в буфер обмена в Windows, используя Python?

Плюс, Tkinter находится в стандартной библиотеке Python.

Некоторый код, который получит значение буфера обмена через Tkinter: из Tkinter import Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = & quot; CLIPBOARD & quot;) [\ nl] r.destroy ()
80

win32clipboard, которая является частьюpywin32.

Вот пример, который сначала устанавливает данные буфера обмена, а затем получает их:

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

Важное напоминание из документации:

When the window has finished examining or changing the clipboard, close the clipboard by calling CloseClipboard. This enables other windows to access the clipboard. Do not place an object on the clipboard after calling CloseClipboard.

@Norfeldt Если нет собственного способа, вы можете легко создать свой собственный объект, который поддерживает & quot; с & quot;
Вы знаете, есть ли способ использовать `with & # xB4; заявление ?
Этот модуль полезен, если вы хотите выполнять более сложные операции, например, извлечение содержимого в формате HTML из буфера обмена. Увидетьstackoverflow.com/questions/17298897/…
Стоит отметить, что в py34, win7 SetClipboardText не работал без предшествующего вызова EmptyClipboard
2

console program Ответы с tkinter выше не работали для меня, потому что .destroy () всегда выдавал ошибку:

can't invoke "event" command: application has been destroyed while executing...

или при использовании .withdraw () окно консоли не вернуло фокус.

Чтобы решить эту проблему, вы также должны вызвать .update () перед .destroy (). Пример:

# Python 3
import tkinter

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

Функция r.withdraw () предотвращает показ кадра в течение миллисекунды, а затем он будет уничтожен, возвращая фокус на консоль.

4

что это был самый простой способ получить доступ к буферу обмена из python:

1) Установите pyperclip: pip install pyperclip

2) Использование:

import pyperclip

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

# the type of s is string

Протестировано на Win10 64-bit, Python 3.5. Кажется, работает и с не-ASCII символами. К числу протестированных символов относятся & # xB1; & # xA9; & # xA9; & # x3B1; & # x3B2; & # x3B3; & # x3B8; & # x394; & # x3A8; & # x3A6; & # xE5 ; & # xe4; & # XF6;

Похожие вопросы