Python ile (Windows) panosundaki metni nasıl okuyabilirim?
Yanıtlar:
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.
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()
tkinter
yerine olmalıdır Tkinter
. Aksi takdirde python 3.7.3 64bit win10'umda çalışmadı.
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.
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
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())
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()
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()
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()
from pyperclip import copy, paste
.
clipboard
, bu daha iyi bir isim. Bu işlev Python standart kitaplığına dahil edilmelidir.
Win32all paketinden win32clipboard'u deneyin (ActiveState Python kullanıyorsanız muhtemelen yüklüdür).
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.