2010-10-10 1 views
7

Я хочу, чтобы мой скрипт Python мог копировать и вставлять в/из буфера обмена через x11 (чтобы он работал в Linux). Может ли кто-нибудь указать мне на конкретные ресурсы, на которые я могу смотреть, или на концепции, которые я должен был бы освоить?Как Python может получить доступ к буферу X11?

Возможно ли это сделать с библиотекой Python X по адресу http://python-xlib.sourceforge.net?

ответ

0

You can do this with pygtk. Чистое решение, но может быть немного переполнено в зависимости от вашего приложения.

Другой способ получения google - hits - сделать системный вызов xsel.

3

Я одобряю решение на основе Tkinter, которое требует pygtk, просто из-за потенциала, который последний имеет для задач установки. Учитывая это, моя рекомендация Элвина Смита следующим образом:

+0

Первая ссылка не работает. –

1

решение Tkinter на основе упомянутого в Cameron Laird's answer:

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

Заменить "CLIPBOARD" с «PRIMARY», чтобы вместо этого выбрать PRIMARY.

Также см. this answer.

питона-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")) 
0

Использование clipboard модуль

Первый, установить модуль 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. 

 Смежные вопросы

  • Нет связанных вопросов^_^