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


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.


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

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.


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

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


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

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

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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.