Jak czytać tekst ze schowka (Windows) z Pythona?

97

Jak czytać tekst ze schowka (Windows) z Pythona?

Foo42
źródło
3
Związane z tym pytaniem .
glglgl
w moim przypadku działała tylko odpowiedź dana , która używa pakietu schowka .
Soorena

Odpowiedzi:

106

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.

Sakin
źródło
6
Czy wiesz, czy istnieje sposób użycia instrukcji „with”?
Norfeldt,
3
Warto zauważyć, że w py34, win7, SetClipboardText nie działał bez poprzedzającego wywołania EmptyClipboard
CoderTao
Ten moduł jest przydatny, jeśli chcesz wykonać bardziej złożone operacje, np. Wyciągnąć zawartość w formacie HTML ze schowka. Zobacz stackoverflow.com/questions/17298897/…
xji,
2
@Norfeldt Jeśli nie ma natywnego sposobu, możesz łatwo utworzyć własny niestandardowy obiekt, który obsługuje „z”
Elijas Dapšauskas
41

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()
kmonsoor
źródło
2
Dodaj komentarz do tego kodu i (prawdopodobnie) linki do rewelacyjnej dokumentacji.
jb.
7
powinno być tkinterzamiast Tkinter. W przeciwnym razie nie działało na moim Pythonie 3.7.3 64-bitowym win10.
jerik
21

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.

Przyciski840
źródło
3
Kod, który pobierze wartość schowka za pośrednictwem Tkinter: from Tkinter import Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "CLIPBOARD") [\ nl] r.destroy ()
mgkrebbs
18

Jeśli nie chcesz instalować dodatkowych pakietów, ctypesmoż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())
kichik
źródło
To wydaje się nie działać w systemie Windows 10. Zawsze wyświetla „Brak”.
Aran-Fey
Windows 10 działał dobrze, o ile korzystałem z 32-bitowego Pythona. Zaktualizowałem odpowiedź, aby działała również z wersją 64-bitową.
kichik
idź ten błąd "oczekiwany wskaźnik znaku, dostałem int" w linii "text = ctypes.c_char_p (data_locked)", jakiś pomysł?
txemsukr
1
Byłoby wspaniale zobaczyć podobne rozwiązanie do kopiowania tekstu również do schowka.
mrkbutty
17

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 ± ° © © αβγθΔΨΦåäö

np8
źródło
czy nadaje się do 3.6? został pomyślnie zainstalowany, ale przy użyciu metody paste () pojawia się błąd: "z wersji importu PySide jako PYSIDE_VERSION # analiza: ignoruj ​​ModuleNotFoundError: Brak modułu o nazwie 'PySide'". Kiedy próbowałem zainstalować Pyside, pojawia się komunikat, że nie jest obsługiwany w 3.6
gaurav
Tak, powinno działać na Pythonie 3.6, a właśnie testowałem z Pythonem 3.7.4 (64-bit). Patrząc na plik setup.py pakietu, nie powinien on mieć żadnych zależności od Pyside ani żadnych innych pakietów. Czy na pewno polecenie wklejania próbuje użyć Pyside?
np8
Tak, polecenie wklejania szuka Pyside, a ponieważ Pyside obsługuje tylko Pythona do wersji 3.4, powoduje błąd
gaurav
Wydaje się, że jest to najprostsze rozwiązanie dla WSL z
pythonem3.6
11

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()
urodzony
źródło
8

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()
Paul Sumpner
źródło
4

Użyj schowka biblioteki Pythona

Jest po prostu używany w ten sposób:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  
Dan
źródło
9
Zasadniczo jest to użycie pyperclip. Cały kod źródłowy tego modułu jest dosłownie: from pyperclip import copy, paste.
pbreach
to prawda. Jednak mają rację, że clipboardto lepsze imię. Ta funkcja powinna być zawarta w standardowej bibliotece Pythona.
Vincenzooo
3

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.

user136036
źródło
1

Niezbyt bezpośrednia sztuczka:

Użyj skrótu pyautogui:

Import pyautogui
pyautogui.hotkey('ctrl', 'v')

Dlatego możesz wkleić dane ze schowka, jak chcesz.

patrz2
źródło