Скопируйте HTML в буфер обмена с помощью PyGObject

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

Согласно документам PyGObject, метод Gtk.Clipboard объекта set_with_data() должен быть подходящим. Но когда я пытаюсь его использовать, в классе нет set_with_data члена.

>>> from gi.repository import Gtk, Gdk
>>> clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
>>> clipboard.set_with_data
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Clipboard' object has no attribute 'set_with_data'

Как я могу скопировать HTML плюс открытый текст в буфер обмена с помощью PyGObject?

(Я мог бы рассмотреть возможность использования PyGTK, однако согласно этому ответу он устарел и не поддерживается в Python 3.x.)


person Craig McQueen    schedule 06.08.2014    source источник


Ответы (2)


Похоже, что set_with_data() не подвергается самоанализу, вероятно, из-за того, что функция принимает два обратных вызова C (не поддерживается самоанализом или привязками). См.:
https://developer.gnome.org/gtk3/stable/gtk3-Clipboards.html#gtk-clipboard-set-with-data

Эта ошибка уже зарегистрирована в GTK+:
https://bugzilla.gnome.org/show_bug.cgi?id=656312

Некоторые возможные обходные пути:

  • Ограничьте свою программу только текстом, используя clipboard.set_text() (нарушает ваше требование)
  • Напишите расширение C Python или даже используйте самоанализ в своей собственной библиотеке прокладок, которая дает замыкающую версию set_with_data(). Также можно было бы использовать что-то вроде ctypes, но, вероятно, это болезненно.
  • Используйте PyGTK (который, как вы упомянули, больше не поддерживается) или другой набор инструментов, например PySide/Qt, wxPython и т. д.
person Simon Feltman    schedule 06.08.2014
comment
Эта ошибка GTK+ по-прежнему помечена как НОВАЯ с августа 2011 года. Я больше не могу задерживать дыхание. :) - person Craig McQueen; 03.05.2017

Я не мог сделать это с помощью Python, но нашел следующий обходной путь, используя xclip:

import subprocess

s = "TEXT TO <b>COPY</b>!"
cmd = ["xclip", "-sel", "clip", "-t", "text/html", "-f"]
subprocess.check_output(cmd, input=s, text=True)
person Udi    schedule 11.01.2020