【问题标题】:How to get clipboard content in GTK3 (GI) and Python 3 on Ubuntu如何在 Ubuntu 上获取 GTK3 (GI) 和 Python 3 中的剪贴板内容
【发布时间】:2012-11-03 09:37:22
【问题描述】:

在 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

【问题讨论】:

  • 是否考虑将此作为错误发布到 Ubuntu 或 Gnome?
  • 你好。我开始怀疑这是否是一个错误,但我想先确定一下。

标签: python ubuntu python-3.x pygtk gtk3


【解决方案1】:

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

由于 GTK3 将 gobject introspection 与 Python 一起使用,因此在 PyGTK 中手动维护的一些魔法不存在。如果您查看C API for the Clipboard,您将看到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()

【讨论】:

  • 你好,米卡。我知道函数的参数,但我基于我在互联网上看到的一些示例(应该可以工作)。不仅是 Python 中的示例,还有 Vala 中的示例。反正 Gtk.Clipboard(Gdk.SELECTION_CLIPBOARD) 会抛出类型错误:
  • >>> cb = Gtk.Clipboard(Gdk.SELECTION_CLIPBOARD) Traceback(最近一次调用最后):文件“”,第 1 行,在 类型错误:GObject.__init__()正好接受 0 个参数(1 个给定)
  • 对不起,我的意思是cb = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)。没有构造函数,因为没有对应的gtk_clipboard_new
猜你喜欢
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 2013-07-23
  • 2011-09-18
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多