从python访问备用剪贴板格式

ale*_*xis 10 python windows macos clipboard tkinter

从支持富文本的应用程序复制到剪贴板通常会以多种格式添加文本.我需要找出可用的格式,然后以选定的格式检索剪贴板内容.如果它很重要,我对富文本格式(来自Word,Acrobat,浏览器......)感兴趣,而不是图像数据或其他exotica.

我看了看,但我找到的解决方案仅限于纯文本,超级过时,特定于Windows(我在OS X上),依赖命令行实用程序pbcopypbpaste(不处理所有剪贴板格式) ),或以上几种.

那么:我如何获得剪贴板中存在的格式列表,并以我选择的格式提取其内容?

平台,按照兴趣顺序:系统独立(我希望),OS X Mountain Lion(我当前的平台)或类似的,其他平台(我计划分发我的代码).

选定的链接

pyperclip:看起来很有趣,但在OS X上它委托给pbcopypbpaste支持text,rtfps仅格式.

来自activestate的此配方仅适用于Windows,但显示了如何获取HTML.(这个问题涉及到它).

这个SO答案也特定于win32clipboard.

这个问题是关于将文件拖放到剪贴板(在Windows上).有趣,但没有帮助我需要什么.

这个基于 tkinter 的解决方案很简单,仍然适用于OS X,但它只能获得纯文本 - 而且我没有发现tkinter可以处理其他任何事情的证据.

显示了用于文本放在剪贴板上的几乎相同的tkinter代码.

编辑(2017年5月)

我现在有一个OS X的解决方案(请参阅下面的自我回答),但我希望听到是否(以及如何)pyperclip或其他模块可以在Windows上执行相同的操作.Pyperclip深入了解Windows API,因此它不能远离支持所有可用格式的列表和选择.

ale*_*xis 2

借助pypi 上提供的richxerox模块,这在 OS X 上非常简单。它需要系统支持,包括AppleAppKitFoundation模块。我在为 Python 3 构建 Objective C 时遇到了麻烦,因此最初我只让它适用于 Python 2。然而,Anaconda 3 预装了所有必要的部分。

下面是一个演示,它打印可用的剪贴板类型,然后获取并打印每一种类型:

import richxerox as rx

# Dump formats
verbose = True
if verbose:
        print(rx.available(neat=False, dyn=True))
    else:
        print(rx.available())

# Dump contents in all formats
for k, v in rx.pasteall(neat=False, dyn=True).items():
    line = "\n*** "+k+":  "+v
    print(line)
Run Code Online (Sandbox Code Playgroud)

输出:

(
    "public.html",
    "public.utf8-plain-text"
)

*** public.html:  <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head><body><a href="http://coffeeghost.net/2010/10/09/pyperclip-a-cross-platform-clipboard-module-for-python/" 
  rel="nofollow noreferrer">pyperclip</a>: Looks interesting</body></html>

*** public.utf8-plain-text:  pyperclip: Looks interesting
Run Code Online (Sandbox Code Playgroud)

要以所需的格式打印并回退到文本,您可以使用以下命令:

paste_format = "rtf"
content = rx.paste(paste_format)
if not content:
    content = rx.paste("text")
Run Code Online (Sandbox Code Playgroud)

或者您可以先检查格式是否可用:

if "public.rtf" in rx.available():
    content = rx.paste("rtf")
else:
    content = rx.paste("text")
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

686 次

最近记录:

7 年,3 月 前