ฉันจะอ่านข้อความจากคลิปบอร์ด (windows) จาก python ได้อย่างไร
ฉันจะอ่านข้อความจากคลิปบอร์ด (windows) จาก python ได้อย่างไร
คำตอบ:
คุณสามารถใช้โมดูลที่เรียกว่าwin32clipboardซึ่งเป็นส่วนหนึ่งของpywin32
นี่คือตัวอย่างที่ตั้งค่าข้อมูลคลิปบอร์ดก่อนจากนั้นจึงรับข้อมูล:
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
คำเตือนที่สำคัญจากเอกสารประกอบ:
เมื่อหน้าต่างตรวจสอบหรือเปลี่ยนคลิปบอร์ดเสร็จแล้วให้ปิดคลิปบอร์ดโดยเรียก CloseClipboard ซึ่งทำให้หน้าต่างอื่น ๆ สามารถเข้าถึงคลิปบอร์ดได้ อย่าวางวัตถุบนคลิปบอร์ดหลังจากเรียก CloseClipboard
คุณสามารถทำได้อย่างง่ายดายผ่านโมดูลในตัวTkinterซึ่งโดยพื้นฐานแล้วเป็นไลบรารี GUI รหัสนี้สร้างวิดเจ็ตเปล่าเพื่อรับเนื้อหาคลิปบอร์ดจาก OS
#from tkinter import Tk # Python 3
from Tkinter import Tk
Tk().clipboard_get()
tkinter
Tkinter
ในทางกลับกันมันใช้ไม่ได้กับ python 3.7.3 64bit win10 ของฉัน
ฉันเห็นคำแนะนำมากมายในการใช้โมดูล win32 แต่ Tkinter มีวิธีที่สั้นและง่ายที่สุดที่ฉันเคยเห็นดังในโพสต์นี้: ฉันจะคัดลอกสตริงไปยังคลิปบอร์ดบน Windows โดยใช้ Python ได้อย่างไร
นอกจากนี้ Tkinter ยังอยู่ในไลบรารีมาตรฐาน python
หากคุณไม่ต้องการติดตั้งแพ็คเกจเสริมctypes
ก็สามารถทำงานให้ลุล่วงได้เช่นกัน
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())
ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุดในการเข้าถึงคลิปบอร์ดจาก python:
1) ติดตั้ง pyperclip:
pip install pyperclip
2) การใช้งาน:
import pyperclip
s = pyperclip.paste()
pyperclip.copy(s)
# the type of s is string
ทดสอบบน Win10 64-bit, Python 3.5 และ Python 3.7.3 (64-bit) ดูเหมือนว่าจะทำงานกับอักขระที่ไม่ใช่ ASCII ด้วย อักขระที่ทดสอบ ได้แก่ ±°©©αβγθΔΨΦåäö
คำตอบที่ได้รับการโหวตมากที่สุดข้างต้นนั้นแปลกตรงที่เพียงแค่ล้างคลิปบอร์ดแล้วรับเนื้อหา (ซึ่งว่างเปล่า) เราสามารถล้างคลิปบอร์ดเพื่อให้แน่ใจว่าเนื้อหาคลิปบอร์ดบางประเภทเช่น "ข้อความที่จัดรูปแบบ" ไม่ "ครอบคลุม" เนื้อหาข้อความธรรมดาที่คุณต้องการบันทึกในคลิปบอร์ด
โค้ดต่อไปนี้จะแทนที่บรรทัดใหม่ทั้งหมดในคลิปบอร์ดด้วยการเว้นวรรคจากนั้นจะลบช่องว่างคู่ทั้งหมดและบันทึกเนื้อหากลับไปที่คลิปบอร์ด:
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 ทำได้ ...
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 library Clipboard
ใช้เพียงแค่นี้:
import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()
from pyperclip import copy, paste
รหัสที่มาทั้งหมดของโมดูลนี้เป็นตัวอักษร:
clipboard
เป็นชื่อที่ดีกว่า ฟังก์ชันนี้ควรรวมอยู่ในไลบรารีมาตรฐาน Python
ลองใช้ win32clipboard จากแพ็คเกจ win32all (ซึ่งอาจติดตั้งแล้วหากคุณใช้ ActiveState Python)
ดูตัวอย่างที่นี่: http://code.activestate.com/recipes/474121/
สำหรับโปรแกรมคอนโซลของฉันคำตอบด้วย tkinter ด้านบนไม่ได้ผลสำหรับฉันเพราะ .destroy () ให้ข้อผิดพลาดเสมอ:
ไม่สามารถเรียกใช้คำสั่ง "เหตุการณ์": แอปพลิเคชันถูกทำลายขณะดำเนินการ ...
หรือเมื่อใช้. ถอน () หน้าต่างคอนโซลไม่ได้รับโฟกัสกลับมา
ในการแก้ปัญหานี้คุณต้องเรียก. update () ก่อน .destroy () ตัวอย่าง:
# Python 3
import tkinter
r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()
r.withdraw () ป้องกันไม่ให้เฟรมแสดงเป็นมิลลิวินาทีจากนั้นเฟรมจะถูกทำลายโดยให้โฟกัสกลับไปที่คอนโซล
เคล็ดลับที่ไม่ตรงมาก:
ใช้คีย์ลัด pyautogui:
Import pyautogui
pyautogui.hotkey('ctrl', 'v')
ดังนั้นคุณสามารถวางข้อมูลคลิปบอร์ดได้ตามต้องการ