4

在 Python 2 中,使用我的机器(Ubuntu 12.10)中安装的内容,我可以做到

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
4

1 回答 1

3

您不仅仅是在处理 Python 2 和 Python 3 —— 事实上,在这种情况下,这无关紧要。重要的第一个示例使用的是 GTK2 的 PyGTK,第二个示例使用的是 GTK3 的 PyGObject。

由于 GTK3 在 Python 中使用gobject 自省,因此在 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()
于 2012-11-14T00:36:17.197 回答