我希望我的Python脚本能够通过x11复制和粘贴到剪贴板(因此它可以在Linux上运行)。任何人都能指出我可以看到的具体资源,或者我必须掌握的概念吗?
这可能与http://python-xlib.sourceforge.net上的Python X库有关吗?
答案 0 :(得分:3)
我赞成基于Tkinter的解决方案而不是需要pygtk的解决方案,这仅仅是因为后者对安装挑战的潜在影响。鉴于此,我对Alvin Smith的建议是:
答案 1 :(得分:2)
基于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") )
答案 2 :(得分:1)
You can do this with pygtk。一个干净的解决方案,但根据您的应用可能有点矫枉过正。
答案 3 :(得分:0)
您可能会发现此主题非常有用:How does X11 clipboard handle multiple data formats?
答案 4 :(得分: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.