从python访问备用剪贴板格式

从python访问备用剪贴板格式,python,windows,macos,tkinter,clipboard,Python,Windows,Macos,Tkinter,Clipboard,从支持富文本的应用程序复制到剪贴板通常会添加多种格式的文本。我需要找出可用的格式,然后以选定的格式检索剪贴板内容。如果有关系的话,我感兴趣的是富文本格式(来自Word、Acrobat、浏览器等),而不是图像数据或其他格式 我看了又看,但我找到的解决方案仅限于纯文本,特定于Windows(我在OS X上)、命令行实用程序pbcopy和pbpaste(它们不处理所有剪贴板格式)或上述几种格式 那么:我如何获得剪贴板中的格式列表,并以我选择的格式提取其内容 平台,按兴趣顺序:系统独立(我希望)、OSX

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

我看了又看,但我找到的解决方案仅限于纯文本,特定于Windows(我在OS X上)、命令行实用程序
pbcopy
pbpaste
(它们不处理所有剪贴板格式)或上述几种格式

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

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

选定链接 :看起来很有趣,但在OS X上,它只支持
文本
rtf
ps
格式的
pbcopy
pbpaste

from activestate仅适用于Windows,但演示了如何获取HTML。(所以问题指的是它)

也是特定于win32clipboard的

问题是将文件拖放到剪贴板(在Windows上)。很有意思,但我需要什么帮助都没有

它很简单,仍然可以在OSX上运行,但它只能得到纯文本——而且我没有发现任何证据表明tkinter可以处理其他任何事情

显示用于将文本放入剪贴板的几乎相同的tkinter代码

编辑(2017年5月)
我现在有了一个针对OS X的解决方案(见下文),但我希望听到
pyperclip
或其他模块是否(以及如何)在Windows上也能做到这一点。Pyperclip深陷Windows API,因此它离支持所有可用格式的列表和选择不远了

借助pypi上提供的模块,在OSX上它非常简单。它需要系统支持,包括Apple
AppKit
Foundation
模块。我在为Python3构建Objective C时遇到了困难,所以最初我只在Python2上实现了这个目标。然而,Anaconda3预装了所有必要的部件

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

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)
输出:

(
    "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
或者,您可以先检查格式是否可用:

if "public.rtf" in rx.available():
    content = rx.paste("rtf")
else:
    content = rx.paste("text")
if "public.rtf" in rx.available():
    content = rx.paste("rtf")
else:
    content = rx.paste("text")