Python如何访问X11剪贴板?

13
我希望我的Python脚本能够通过x11复制和粘贴剪贴板(以便在Linux上使用)。有人可以指导我查看具体资源或我需要掌握的概念吗?
这是否可以使用Python X库在http://python-xlib.sourceforge.net中实现?

请注意,仅使用xlib或下面所述的其他解决方案将仅复制/粘贴文本;而现在大多数应用程序还可以复制/粘贴图像或其他格式:对于这些情况,您可能需要使用gtkqt库。此外,在大多数应用程序中,使用中间鼠标按钮而不是ctrl-v来粘贴X11剪贴板。 - am70
5个回答

6

Tkinter基础解决方案提到在Cameron Laird的答案中:

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

将“CLIPBOARD”替换为“PRIMARY”,以获取PRIMARY选择而不是剪贴板。
还可以查看此答案
基于PrintSelection()python-xlib/examples/get_selection.py,这是python-xlib解决方案
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") )

3

第一个链接已经失效。 - davidrmcharles

1

第一个链接已经失效。 - Andrew

0

0

使用clipboard模块

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

$ sudo pip3 install clipboard

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

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

但这并不意味着你可以使用“PRIMARY”选择,是吗? - hithwen
根据“clipboard”的作者所说,这可能是一个更好的选择:https://github.com/asweigart/pyperclip - am70

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接