Pab*_*blo 6 python ubuntu pygtk python-3.x gtk3
在Python 2中,通过我的机器(Ubuntu 12.10)中安装的内容,我可以这样做
import gtk
cb = gtk.clipboard_get()
content = cb.wait_for_text()
Run Code Online (Sandbox Code Playgroud)
从剪贴板获取文本。
然而,在 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
Run Code Online (Sandbox Code Playgroud)
    您不只是处理 Python 2 和 Python 3 —— 事实上,这在本例中是无关紧要的。重要的是第一个示例使用 PyGTK(即 GTK2),第二个示例使用 PyGObject(即 GTK3)。
由于 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()
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2870 次  |  
        
|   最近记录:  |