Python如何访问X11剪贴板?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python如何访问X11剪贴板?相关的知识,希望对你有一定的参考价值。

我希望我的Python脚本能够通过x11复制和粘贴到剪贴板(因此它可以在Linux上运行)。任何人都能指出我可以看到的具体资源,或者我必须掌握的概念吗?

这可能与http://python-xlib.sourceforge.net上的Python X库有关吗?

答案

我赞成基于Tkinter的解决方案而不是一个需要pygtk的解决方案,这仅仅是因为后者对安装挑战的潜在影响。鉴于此,我对Alvin Smith的建议是:

另一答案

Cameron Laird's answer中提到的基于Tkinter的解决方案:

import Tkinter
root = Tkinter.Tk()
print(root.selection_get(selection="CLIPBOARD"))

将“CLIPBOARD”替换为“PRIMARY”以取代PRIMARY

另见this answer

python-xlib解决方案,基于PrintSelection()python-xlib/examples/get_selection.py

from Xlib import X, display as Xdisplay

def property2str(display, prop):
    if prop.property_type == display.get_atom("STRING"):
        return prop.value.decode('ISO-8859-1')
    elif prop.property_type == display.get_atom("UTF8_STRING"):
        return prop.value.decode('UTF-8')
    else:
        return "".join(str(c) for c in prop.value)

def get_selection(display, window, bufname, typename):
    bufid = display.get_atom(bufname)
    typeid = display.get_atom(typename)
    propid = display.get_atom('XSEL_DATA')
    incrid = display.get_atom('INCR')

    window.change_attributes(event_mask = X.PropertyChangeMask)
    window.convert_selection(bufid, typeid, propid, X.CurrentTime)
    while True:
        ev = display.next_event()
        if ev.type == X.SelectionNotify and ev.selection == bufid:
            break

    if ev.property == X.NONE:
        return None # request failed, e.g. owner can't convert to target format type
    else:
        prop = window.get_property(propid, X.AnyPropertyType, 0, 2**31-1, 1)

        if prop.property_type == incrid:
            result = ""
            while True:
                while True:
                    ev = display.next_event()
                    if ev.type == X.PropertyNotify and ev.atom == propid and ev.state == X.PropertyNewValue:
                        break

                prop = window.get_property(propid, X.AnyPropertyType, 0, 2**31-1, 1)
                if len(prop.value) == 0:
                    break

                result += property2str(display, prop)
            return result
        else:
            return property2str(display, prop)

display = Xdisplay.Display()
window = display.screen().root.create_window(0,0, 1,1, 0, X.CopyFromParent)
print( get_selection(display, window, "CLIPBOARD", "UTF8_STRING") or 
       get_selection(display, window, "CLIPBOARD", "STRING") )
另一答案

You can do this with pygtk。一个干净的解决方案,但根据您的应用程序可能有点矫枉过正。

得到一些google-hits的另一种方法是对xsel进行系统调用。

另一答案

你可能会发现这个主题很有用:How does X11 clipboard handle multiple data formats?

另一答案

Using the clipboard module

首先,使用clipboard安装pip3模块:

$ sudo pip3 install clipboard

使用这个跨平台模块(Linux,Mac,Windows)非常简单:

import clipboard
clipboard.copy('text')   # Copy to the clipboard.
text = clipboard.paste()   # Copy from the clipboard.

以上是关于Python如何访问X11剪贴板?的主要内容,如果未能解决你的问题,请参考以下文章

使用剪贴板跟踪 x11 中的复制粘贴

如何在Vim中复制到剪贴板?

在 gnome-terminal 内的 Emacs 实例中使用 X11 剪贴板

python文件X11远程运行问题

python python函数,使剪贴板可以访问脚本

从 python 访问备用剪贴板格式