Jak czytać tekst ze schowka (Windows) z Pythona?
Odpowiedzi:
Możesz użyć modułu o nazwie win32clipboard , który jest częścią pywin32 .
Oto przykład, który najpierw ustawia dane ze schowka, a następnie je pobiera:
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
Ważne przypomnienie z dokumentacji:
Gdy okno zakończy badanie lub zmianę schowka, zamknij schowek, wywołując CloseClipboard. Umożliwia to innym oknom dostęp do schowka. Nie umieszczaj obiektu w schowku po wywołaniu CloseClipboard.
można to łatwo zrobić za pomocą wbudowanego modułu Tkinter, który jest w zasadzie biblioteką GUI. Ten kod tworzy pusty widżet w celu pobrania zawartości schowka z systemu operacyjnego.
#from tkinter import Tk # Python 3
from Tkinter import Tk
Tk().clipboard_get()
tkinter
zamiast Tkinter
. W przeciwnym razie nie działało na moim Pythonie 3.7.3 64-bitowym win10.
Widziałem wiele sugestii dotyczących użycia modułu win32, ale Tkinter zapewnia najkrótszą i najłatwiejszą metodę, jaką widziałem, jak w tym poście: Jak skopiować ciąg do schowka w systemie Windows przy użyciu Pythona?
Dodatkowo Tkinter znajduje się w standardowej bibliotece Pythona.
Jeśli nie chcesz instalować dodatkowych pakietów, ctypes
możesz również wykonać zadanie.
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())
Dowiedziałem się, że to najłatwiejszy sposób na uzyskanie dostępu do schowka z Pythona:
1) Zainstaluj pyperclip:
pip install pyperclip
2) użycie:
import pyperclip
s = pyperclip.paste()
pyperclip.copy(s)
# the type of s is string
Testowane na 64-bitowych systemach Win10, Python 3.5 i Python 3.7.3 (64-bitowe). Wydaje się, że działa również ze znakami spoza zestawu ASCII. Testowane postacie to ± ° © © αβγθΔΨΦåäö
Najbardziej pozytywna odpowiedź powyżej jest dziwna, ponieważ po prostu czyści schowek, a następnie pobiera zawartość (która jest następnie pusta). Można wyczyścić schowek, aby mieć pewność, że niektóre typy zawartości schowka, takie jak „tekst sformatowany”, nie „zakrywają” zawartości zwykłego tekstu, którą chcesz zapisać w schowku.
Poniższy fragment kodu zastępuje wszystkie znaki nowej linii w schowku spacjami, a następnie usuwa wszystkie podwójne spacje i ostatecznie zapisuje zawartość z powrotem do schowka:
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()
Biblioteka standardowa Pythona robi to ...
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()
from pyperclip import copy, paste
.
clipboard
to lepsze imię. Ta funkcja powinna być zawarta w standardowej bibliotece Pythona.
Wypróbuj win32clipboard z pakietu win32all (prawdopodobnie jest on zainstalowany, jeśli korzystasz z ActiveState Python).
Zobacz próbkę tutaj: http://code.activestate.com/recipes/474121/
W moim programie konsolowym odpowiedzi z tkinter powyżej nie do końca działały, ponieważ .destroy () zawsze dawał błąd:
nie można wywołać polecenia „zdarzenie”: aplikacja została zniszczona podczas wykonywania ...
lub podczas używania .withdraw () okno konsoli nie odzyskało fokusu.
Aby rozwiązać ten problem, musisz również wywołać .update () przed .destroy (). Przykład:
# Python 3
import tkinter
r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()
R.Withdraw () zapobiega wyświetlaniu klatki przez milisekundę, a następnie zostanie zniszczona, przywracając fokus konsoli.