Как Python может получить доступ к буферу обмена X11? - PullRequest
9 голосов
/ 11 октября 2010

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

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

Ответы [ 5 ]

3 голосов
/ 11 октября 2010

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

2 голосов
/ 09 июля 2017

Решение на основе Tkinter , упомянутое в Ответ Кэмерона Лэйрда :

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

Замените "CLIPBOARD" на "PRIMARY", чтобы получить выбор PRIMARY.

Также см. этот ответ .

решение 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") )
1 голос
/ 11 октября 2010

Вы можете сделать это с помощью pygtk . Чистое решение, но может быть немного излишним в зависимости от вашего приложения.

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

0 голосов
/ 22 декабря 2017

Использование модуля 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.
0 голосов
/ 11 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...