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

Python2とPython3を扱っているだけではありません。実際、この場合は関係ありません。重要なのは、最初の例ではGTK2であるPyGTKを使用し、2番目の例でGTK3であるPyGObjectを使用していることです。

GTK3はPythonでgobjectイントロスペクションを使用しているため、PyGTKで手動で維持されていた魔法の一部はありません。クリップボードのCAPIを見ると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 に答える