2008-09-19 75 views
58

Làm cách nào để đọc văn bản từ khay nhớ tạm (cửa sổ) từ python?Làm cách nào để đọc văn bản từ khay nhớ tạm (cửa sổ) từ python?

+1

Liên quan đến [câu hỏi này] (http://stackoverflow.com/q/579687/296974). – glglgl

+0

trong trường hợp của tôi, chỉ câu trả lời [dan] (http://stackoverflow.com/users/2084578/dan) hoạt động, sử dụng [clipboard] (https://pypi.python.org/pypi/clipboard/0.0.4) gói. – Soorena

Trả lời

66

Bạn có thể sử dụng các module gọi win32clipboard, mà là một phần của pywin32.

Dưới đây là một ví dụ mà đầu tiên đặt dữ liệu vào clipboard sau đó được nó:

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 

Một lời nhắc nhở quan trọng từ các tài liệu:

Khi cửa sổ đã hoàn tất việc kiểm tra hoặc thay đổi clipboard, đóng clipboard bằng cách gọi CloseClipboard. Điều này cho phép các cửa sổ khác truy cập vào khay nhớ tạm. Không đặt một đối tượng trên khay nhớ tạm sau khi gọi CloseClipboard.

+3

Bạn có biết cách sử dụng câu lệnh 'with´? – Norfeldt

+3

Đáng chú ý, trong py34, win7, SetClipboardText không hoạt động mà không có cuộc gọi trước tới EmptyClipboard – CoderTao

+0

Mô-đun này hữu ích nếu bạn muốn thực hiện các thao tác phức tạp hơn, ví dụ: lấy nội dung được định dạng HTML ra khỏi khay nhớ tạm. Xem http://stackoverflow.com/questions/17298897/how-can-i-copy-from-an-html-file-to-the-clipboard-in-python-in-formatted-text –

19

Tôi đã nhìn thấy nhiều gợi ý để sử dụng các mô-đun win32, nhưng Tkinter cung cấp các phương pháp ngắn nhất và dễ nhất tôi đã nhìn thấy, như trong bài này: How do I copy a string to the clipboard on Windows using Python?

Plus, Tkinter là trong thư viện chuẩn python .

+3

Một số mã sẽ nhận được giá trị clipboard qua Tkinter: từ nhập Tkinter Tk [\ nl] r = Tk() [\ nl] kết quả = r.selection_get (chọn = "CLIPBOARD") [\ nl] r.destroy() – mgkrebbs

11

Câu trả lời được trả lời nhiều nhất ở trên là lạ theo cách đơn giản là xóa Clipboard và sau đó tải nội dung (sau đó sẽ trống). Người ta có thể xóa clipboard để chắc chắn rằng một số loại nội dung clipboard như "văn bản được định dạng" không "che" nội dung văn bản thuần túy của bạn mà bạn muốn lưu vào khay nhớ tạm.

Các đoạn mã sau thay thế tất cả các dòng mới trong clipboard bằng dấu cách, sau đó loại bỏ tất cả các không gian hai và cuối cùng là tiết kiệm nội dung trở lại vào clipboard:

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

Nếu bạn không muốn cài đặt các gói thêm , ctypes cũng có thể hoàn thành công việc.

import ctypes 

CF_TEXT = 1 

kernel32 = ctypes.windll.kernel32 
user32 = ctypes.windll.user32 

user32.OpenClipboard(0) 
if user32.IsClipboardFormatAvailable(CF_TEXT): 
    data = user32.GetClipboardData(CF_TEXT) 
    data_locked = kernel32.GlobalLock(data) 
    text = ctypes.c_char_p(data_locked) 
    print(text.value) 
    kernel32.GlobalUnlock(data_locked) 
else: 
    print('no text in clipboard') 
user32.CloseClipboard() 
18

bạn có thể dễ dàng thực hiện việc này thông qua mô-đun tích hợp Tkinter cơ bản là thư viện GUI. Mã này tạo ra một widget trống để có được nội dung clipboard từ hệ điều hành.

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

Vui lòng thêm nhận xét vào mã này và (có thể) liên kết đến tài liệu vui chơi. –

+0

@jb. done :) cảm ơn ghi chú – kmonsoor

2

Đối với giao diện điều khiển chương trình tôi câu trả lời với Tkinter trên đã không hoàn toàn công việc cho tôi vì .destroy() luôn luôn đưa ra một lỗi ,:

không thể gọi "sự kiện" lệnh : ứng dụng đã bị phá hủy trong khi thực hiện ...

hoặc khi sử dụng .withdraw() cửa sổ bảng điều khiển không lấy lại tiêu điểm.

Để giải quyết điều này, bạn cũng phải gọi .update() trước .destroy().Ví dụ:

# Python 3 
import tkinter 

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

R.withdraw() ngăn khung hiển thị trong một mili giây và sau đó nó sẽ bị hủy để đưa tiêu điểm trở lại bảng điều khiển.

2

Sử dụng Trăn thư viện Clipboard

của nó chỉ đơn giản là sử dụng như thế này:

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

những người khác không hoạt động, cảm ơn bạn. – Soorena

+0

Điều này chủ yếu là sử dụng pyperclip. Toàn bộ mã nguồn của mô-đun này là theo nghĩa đen: 'từ bản sao nhập khẩu pyperclip, dán'. – pbreach

1

tôi phát hiện ra đây là cách dễ nhất để có được quyền truy cập vào clipboard từ python:

1) Cài đặt pyperclip : pip install pyperclip

2) Cách sử dụng:

import pyperclip 

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

# the type of s is string 

Thử nghiệm trên Win10 64-bit, Python 3.5. Dường như cũng hoạt động với các ký tự không phải ASCII. Ký tự được kiểm tra bao gồm ± ° ©© αβγθΔΨΦåäö

Các vấn đề liên quan