Panodaki metni nasıl okuyabilirim?


Yanıtlar:


109

Pywin32'nin bir parçası olan win32clipboard adlı modülü kullanabilirsiniz .

İşte ilk önce pano verilerini ayarlayan ve sonra alan bir örnek:

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

Belgelerden önemli bir hatırlatma:

Pencere panoyu incelemeyi veya değiştirmeyi bitirdiğinde, CloseClipboard'u çağırarak panoyu kapatın. Bu, diğer pencerelerin panoya erişmesini sağlar. CloseClipboard'u çağırdıktan sonra panoya bir nesne yerleştirmeyin.


6
'With' ifadesini kullanmanın bir yolu olup olmadığını biliyor musunuz?
Norfeldt

3
Worth py34, Win7, belirterek, SetClipboardText EmptyClipboard bir önceki çağrısı olmadan çalışma vermedi
CoderTao

Bu modül, örneğin HTML formatlı içeriği panodan çıkarmak gibi daha karmaşık işlemler gerçekleştirmek istiyorsanız kullanışlıdır. Stackoverflow.com/questions/17298897/…
xji

2
@Norfeldt Yerel bir yol yoksa, "ile" yi destekleyen kendi özel nesnenizi kolayca oluşturabilirsiniz
Elijas Dapšauskas

"" "
İle

46

Temelde bir GUI kitaplığı olan yerleşik modül Tkinter aracılığıyla bunu kolayca yapabilirsiniz . Bu kod, pano içeriğini işletim sisteminden almak için boş bir pencere öğesi oluşturur.

#from tkinter import Tk  # Python 3
from Tkinter import Tk
Tk().clipboard_get()

2
Lütfen bu koda yorum ve (muhtemelen) açıklayıcı belgelere bağlantılar ekleyin.
jb.

7
tkinteryerine olmalıdır Tkinter. Aksi takdirde python 3.7.3 64bit win10'umda çalışmadı.
jerik

21

Win32 modülünü kullanmak için birçok öneri gördüm, ancak Tkinter bu yazıda olduğu gibi gördüğüm en kısa ve en kolay yöntemi sağlıyor: Python kullanarak Windows'ta bir dizeyi panoya nasıl kopyalarım?

Artı, Tkinter python standart kütüphanesinde.


3
Pano değerini Tkinter aracılığıyla alacak bazı kodlar: Tkinter'den içe aktarım Tk [\ nl] r = Tk () [\ nl] sonuç = r.selection_get (seçim = "KLİP KARTI") [\ nl] r.destroy ()
mgkrebbs

19

Bunun, panoya python'dan erişmenin en kolay yolu olduğunu öğrendim:

1) Pyperclip'i kurun: pip install pyperclip

2) Kullanım:

import pyperclip

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

# the type of s is string

Win10 64-bit, Python 3.5 ve Python 3.7.3 (64-bit) üzerinde test edilmiştir. ASCII olmayan karakterlerle de çalışıyor gibi görünüyor. Test edilen karakterler arasında ± ° © © αβγθΔΨΦåäö bulunur


3.6 için uygun mu? başarılı bir şekilde yüklendi ancak paste () yöntemi kullanıldığında bana hata veriyor: " PYSIDE_VERSION olarak PySide içe aktarma sürümünden # analiz: ModuleNotFoundError'ı yoksay: 'PySide' adlı modül yok". Ben o 3.6 desteklenmez diyor PySide yüklemeyi denediğimde
Gaurav

Evet, Python 3.6 üzerinde çalışmalı ve ben sadece Python 3.7.4 (64-bit) ile test ettim. Paketin setup.py dosyasına bakıldığında, Pyside veya diğer paketlere bağımlılığı olmamalıdır. Yapıştır komutunun Pyside'ı kullanmaya çalıştığından emin misiniz?
np8

Evet, yapıştır komutu Pyside'ı arıyor ve Pyside yalnızca python 3.4'e kadar desteklediğinden hata veriyor
gaurav


18

Ekstra paketler kurmak istemiyorsanız ctypes, işi de halledebilirsiniz.

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

Bu, Windows 10'da çalışmıyor gibi görünüyor. Her zaman "Yok" yazdırır.
Aran-Fey

Windows 10, Python 32-bit kullandığım sürece benim için iyi çalıştı. Cevabı 64-bit ile de çalışacak şekilde güncelledim.
kichik

bu hataya gidin "beklenen karakter işaretçisi, satırda int var" text = ctypes.c_char_p (data_locked) ", herhangi bir fikriniz var mı?
txemsukr

1
Metni panoya kopyalamak için benzer bir çözüm görmek harika olurdu.
mrkbutty

11

Yukarıdaki en çok oylanan cevap, sadece Pano'yu temizlemesi ve ardından içeriği alması (daha sonra boştur) açısından gariptir. "Biçimlendirilmiş metin" gibi bazı pano içerik türlerinin, panoya kaydetmek istediğiniz düz metin içeriğinizi "kapsamadığından" emin olmak için panoyu temizleyebilirsiniz.

Aşağıdaki kod parçası panodaki tüm yeni satırları boşluklarla değiştirir, ardından tüm çift boşlukları kaldırır ve son olarak içeriği panoya geri kaydeder:

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

Python standart kitaplığı bunu yapar ...

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

Pythons Kütüphane Panosunu Kullan

Basitçe şu şekilde kullanılır:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  

9
Bu aslında pyperclip kullanıyor. Bu modülün tüm kaynak kodu tam anlamıyla: from pyperclip import copy, paste.
pbreach

bu doğru. Ancak haklılar clipboard, bu daha iyi bir isim. Bu işlev Python standart kitaplığına dahil edilmelidir.
Vincenzooo


3

Konsol programım için yukarıdaki tkinter ile cevaplar benim için pek işe yaramadı çünkü .destroy () her zaman bir hata verdi:

"olay" komutu çağırılamıyor: uygulama yürütülürken yok edildi ...

veya .withdraw () kullanılırken konsol penceresi odağı geri alamadı.

Bunu çözmek için .destroy () 'dan önce .update ()' i çağırmanız gerekir. Misal:

# Python 3
import tkinter

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

R.withdraw (), çerçevenin bir milisaniye gösterilmesini engeller ve ardından odağı konsola geri vererek yok edilir.


1

Çok doğrudan olmayan bir numara:

Pyautogui kısayol tuşunu kullanın:

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

Bu nedenle pano verilerini istediğiniz gibi yapıştırabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.