V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
gymmcome
V2EX  ›  Python

Python 操作任意类型剪切板

  •  
  •   gymmcome · 2019-09-29 13:15:11 +08:00 · 3421 次点击
    这是一个创建于 1881 天前的主题,其中的信息可能已经有所发展或是发生改变。

    鄙人手上有一个需求: Axure 原型软件中的元件库不好用,希望通过复制元件并保存剪切板缓存区内容,进行存储。使用 pyqt5 做剪切板管理。

    目前的问题是: 剪切板有很多类型,文字、图片等。但是我的需求中设计到的类型是软件自定义的,我也不需要解析,我只需要进行剪切板存储然后归类,等待下次使用。但是网站上的教程普遍都是操作文字、图片、等剪切板类型

    希望解决: 1、复制任意类型的剪切板内容。 2、将已存储的任意类型剪切板内容重新设置到剪切板。

    当前发现软件 ditto 剪切板工具可以做到这一点,也就是技术上应该是可行的。希望大佬给点建议。

    第 1 条附言  ·  2019-11-14 10:13:38 +08:00
    已解决:
    感谢评论的大神。
    FORMAT = clip.RegisterClipboardFormat("AxureClipboardDocument8.0.5.0")
    def get():
    clip.OpenClipboard()
    data = clip.GetClipboardData(FORMAT)
    clip.CloseClipboard()
    return data

    def set_b(data):
    clip.OpenClipboard() # 打开剪贴板
    clip.EmptyClipboard() # 先清空剪贴板
    clip.SetClipboardData(FORMAT, data)
    clip.CloseClipboard()

    重点:使用 doitto 工具,获取当前应用的剪切板支持类型,例如 AXure8 软件当前版本支持"AxureClipboardDocument8.0.5.0"
    5 条回复    2019-09-29 20:53:08 +08:00
    littlespider89
        1
    littlespider89  
       2019-09-29 13:29:13 +08:00
    剪贴板可以做任意的数据,但自定义的数据是需要序列化反序列化的,1,2 都没问题
    如果 Axure 中的元件是可以复制的,那从剪贴板中拿出 raw 数据保存起来就可以了
    gymmcome
        2
    gymmcome  
    OP
       2019-09-29 13:49:58 +08:00
    @littlespider89
    使用 PYQT5 或者其他库。这个示例代码怎么写,找了两天都没找到
    clipboard = QApplication.clipboard()
    mimeData = clipboard.mimeData()
    clipboard.setMimeData(???)
    littlespider89
        3
    littlespider89  
       2019-09-29 14:38:37 +08:00   ❤️ 1
    @gymmcome 看了下还是挺复杂的,剪贴板系统里有各种 format

    以下代码可参考

    # pip install pywin32

    import win32clipboard as wcb
    format = wcb.RegisterClipboardFormat("myformat")
    wbc.OpenClipboard()
    wcb.SetClipboardData(format, b'rawserializedbytes')
    wcb.GetClipboardData(format)
    # b'rawserializedbytes\x00'

    先把你要保存的对象序列化成 bytes,然后注册一个 format,就可以 set 和 get 了
    Axure 的元件应该是有自己注册的 format,要是能拿到它的 format 类型,就可以获取 raw 数据了

    这段代码把自己系统的剪贴板给搞坏了,我现在都不能复制粘贴了,这些代码还要手动打上去 😂
    gymmcome
        4
    gymmcome  
    OP
       2019-09-29 16:11:51 +08:00
    @littlespider89
    这个类型获取不到啊,ditto 这个软件可以获取各个软件的自定义类型,不知道怎么实现的,可能类型里带了句柄。还有就是 ditto 提供直接复制剪切板缓冲区的功能。python 有这样的方法吗,google 了也找不到。
    qile1
        5
    qile1  
       2019-09-29 20:53:08 +08:00 via Android
       •   1 楼

    Theo d'Or    7 月前

    使用转换方法,在 separate SO question ,对于 png 数据的 hexdump tkinter 从剪贴板提供的正确代码为:

    from tkinter import Tk r = Tk() r.withdraw() clip = r.clipboard_get(type="image/png") r.update() r.destroy() # Convert hexdump to bytes clip = bytes([eval(h) for h in clip.strip().split(' ')]) with open("testbytes.png", mode="bw+") as f: f.write(clip)

    除了写出 PNG 文件外,数据还可以加载 pillow 模块(以前称为 PIL ):

    import io from PIL import Image cf = io.BytesIO(clip) cim = Image.open(cf) cim.show()

    据我所知,这是在 Linux(Debian)上将 PNG 文件从剪贴板读入 Python3 的最佳方法。

    别人的,你看看有没有参考价值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1748 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:30 · PVG 00:30 · LAX 08:30 · JFK 11:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.