Mini GtkButton

Gedit のステータスバーにあるみたいなちっちゃいボタンが使いたい。

gedit_button

タッチパネルを考えると時代に逆行ですけど。
主に確認用として表示させボタンは補助目的としてならアリかと。
実際 Gedit でもこのボタンを使っている人は少ないだろうし。

普通に GtkButton を作ると当然隙間が多く小さくはならない。

#!/usr/bin/env python3

from gi.repository import Gtk

class Win(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("delete-event", Gtk.main_quit)
        vbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
        for s in "ABC":
            button = Gtk.Button.new_with_label(s*10)
            vbox.pack_start(button, False, False, 0)
        self.add(vbox)
        self.show_all()

Win()
Gtk.main()

どうやっているか調べると CSS を使っていた。
Style プロパティの border と padding の値を全部ゼロにすればいいらしい。
ようするに HTML の CSS と同様。

GtkButton はコレしか使わないなら直接 CSS 指定すればいい。
しかしこういう部品は GtkButton のサブクラスを作ったほうが使い易い。
ので gtype を指定した class を作ってこんな感じにすると便利。

#!/usr/bin/env python3

from gi.repository import Gtk

style = """
MiniButton {
    -GtkButton-default-border : 0;
    -GtkButton-default-outside-border : 0;
    -GtkButton-inner-border: 0;
    -GtkWidget-focus-line-width : 0;
    -GtkWidget-focus-padding : 0;
    padding: 0;
}"""

class MiniButton(Gtk.Button):
    __gtype_name__ = "MiniButton"
    def __init__(self, label):
        Gtk.Button.__init__(self, label=label)
        # css
        provider = Gtk.CssProvider()
        provider.load_from_data(style.encode("utf-8"))
        context = self.get_style_context()
        context.add_provider(provider, Gtk.STYLE_PROVIDER_PRIORITY_USER)
        #self.set_relief(Gtk.ReliefStyle.NONE)

class MiniButtonWin(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("delete-event", Gtk.main_quit)
        vbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
        for s in "ABC":
            button = MiniButton(s*10)
            vbox.pack_start(button, False, False, 0)
        self.add(vbox)
        self.show_all()

MiniButtonWin()
Gtk.main()

minibutton

こんなにちっちゃくなりました。
css の指定で Widget のサイズも変わるんだね、これは面白い。