GtkClipboard in PyGI

GtkClipboard を PyGI で試したら PyGtk と少し違っていた。
違うというより C と同じになったというほうが正しいか。

PyGtk

#! /usr/bin/python
# -*- encoding: utf-8 -*-

import gtk

class ClipPyGtk(gtk.Window):
    """
        PyGtk(GTK2) Version
    """
    def __init__(self):
        """
            Copy the label of the button text
        """
        gtk.Window.__init__(self)
        self.connect("delete-event", gtk.main_quit)
        button = gtk.Button("Copy to the Clipboard in PyGtk")
        button.connect("clicked", self.on_button_clicked)
        self.add(button)
        self.show_all()

    def on_button_clicked(self, widget):
        """
            Very easy.
            gtk.Clipboard(display=gtk.gdk.display_get_default(),
                          selection="CLIPBOARD")
        """
        text = widget.get_label()
        clipboard = gtk.Clipboard()
        clipboard.set_text(text)

ClipPyGtk()
gtk.main()

PyGI

#! /usr/bin/python
# -*- encoding: utf-8 -*-

from gi.repository import Gtk, Gdk

class ClipPyGI(Gtk.Window):
    """
        PyGI(GTK3) Version
    """
    def __init__(self):
        """
            Copy the label of the button text
        """
        Gtk.Window.__init__(self)
        self.connect("delete-event", Gtk.main_quit)
        button = Gtk.Button.new_with_label("Copy to the Clipboard in PyGI")
        button.connect("clicked", self.on_button_clicked)
        self.add(button)
        self.show_all()

    def on_button_clicked(self, widget, data=None):
        """
            Like a C.
            gtk.Clipboard() to Gtk.Clipboard.get_for_display().
            There is no default arguments.
        """
        text = widget.get_label()
        display = self.get_display() # or Gdk.Display.get_default()
        clipboard = Gtk.Clipboard.get_for_display(display, Gdk.SELECTION_CLIPBOARD)
        clipboard.set_text(text, len(text)) # or set_text(text, -1)

ClipPyGI()
Gtk.main()

PyGtk では gtk_clipboard_get_for_display() を gtk.Clipboard() に割り当てて更にデフォルト引数を独自に用意していたってことみたい、本当に楽させてもらっていたんだなと。

PyGI は set_text に文字列のバイト長指定も必要、実は -1 でいいのだけど。
Python3 だと文字列が UCS-4 なのでエラいことになるから -1 にしよう。
うーん Python らしくないと思ったけど Vala も確認したら同じだった。
Gtk.Clipboard ? gtk+-3.0

Gtk.Clipboard.get() との違いがイマイチ解らない。
しかしキャストや破棄コードは不要とはいえ随分書くことが増えたものだ。