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.