如何在Ubuntu上使用GTK3(GI)和Python 3获取剪贴板内容

6
在我的机器上(Ubuntu 12.10),使用Python 2,我可以做到以下操作:
import gtk
cb = gtk.clipboard_get()
content = cb.wait_for_text()

从剪贴板中获取文本。

在Python3中,我应该使用Gtk.Clipboard()对象进行相同的操作,但是我遇到了一些与小部件和类似的事物相关的错误,但是我的应用程序没有GUI也不应该有。 我是否在正确的轨道上?

>>> from gi.repository import Gtk
>>> cb = Gtk.Clipboard()
>>> content = cb.wait_for_text()
/usr/lib/python3/dist-packages/gi/types.py:47: Warning: g_object_get_data: assertion `G_IS_OBJECT (object)' failed
  return info.invoke(*args, **kwargs)

(.:10935): Gdk-CRITICAL **: gdk_display_get_default_screen: assertion `GDK_IS_DISPLAY (display)' failed

(.:10935): Gtk-CRITICAL **: gtk_invisible_new_for_screen: assertion `GDK_IS_SCREEN (screen)' failed
/usr/lib/python3/dist-packages/gi/types.py:47: Warning: invalid (NULL) pointer instance
  return info.invoke(*args, **kwargs)
/usr/lib/python3/dist-packages/gi/types.py:47: Warning: g_signal_connect_data: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
  return info.invoke(*args, **kwargs)

(.:10935): Gtk-CRITICAL **: gtk_widget_add_events: assertion `GTK_IS_WIDGET (widget)' failed
/usr/lib/python3/dist-packages/gi/types.py:47: Warning: g_object_set_data: assertion `G_IS_OBJECT (object)' failed
  return info.invoke(*args, **kwargs)
/usr/lib/python3/dist-packages/gi/types.py:47: Warning: g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed
  return info.invoke(*args, **kwargs)

(.:10935): Gdk-CRITICAL **: gdk_display_get_default_screen: assertion `GDK_IS_DISPLAY (display)' failed

(.:10935): Gtk-CRITICAL **: gtk_invisible_new_for_screen: assertion `GDK_IS_SCREEN (screen)' failed

(.:10935): Gtk-CRITICAL **: gtk_widget_add_events: assertion `GTK_IS_WIDGET (widget)' failed

(.:10935): Gtk-CRITICAL **: gtk_widget_get_window: assertion `GTK_IS_WIDGET (widget)' failed

(.:10935): Gtk-CRITICAL **: gtk_selection_convert: assertion `GTK_IS_WIDGET (widget)' failed

考虑将此问题提交给Ubuntu或Gnome的错误报告吗? - deinonychusaur
你好。我开始怀疑这是否是一个bug,但我想先确认一下。 - Pablo
1个回答

5
您不仅仅需要处理Python 2和Python 3 - 实际上在这种情况下这是无关紧要的。重要的是第一个示例使用的是PyGTK,它是GTK2,而第二个示例使用的是PyGObject,它是GTK3。
由于GTK3在Python中使用gobject introspection,因此在PyGTK中手动维护的一些魔法并不存在。如果您查看剪贴板的C API,您将看到Gtk.Clipboard.get()具有用于标识剪贴板的必需参数。这在gtk_clipboard_get_for_display()的参考文档中有解释。
长话短说,在GTK3中正确的代码更像是这样的:
from gi.repository import Gtk, Gdk
cb = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
content = cb.wait_for_text()

你好,Micah。我知道函数的参数,但是我基于我在互联网上看到的一些例子(应该是有效的)。不仅是Python的例子,还有Vala的例子。无论如何,Gtk.Clipboard(Gdk.SELECTION_CLIPBOARD)会抛出类型错误: - Pablo
cb = Gtk.Clipboard(Gdk.SELECTION_CLIPBOARD) 回溯(Traceback)(最近的调用最先被显示) File "<stdin>", line 1, in <module> TypeError: GObject.init()需要0个参数,但给出了1个 - Pablo
抱歉,我的意思是 cb = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)。由于没有相应的 gtk_clipboard_new,因此没有构造函数。 - Micah Carrick

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