L'Isola di Niente
L'Isola di Niente » PyGObject Tips » ボタン

ボタン

ボタンとは説明するまでもなくマウス又はニーモニックにてクリックする為の Widget です。
他にチェックボックスや複数選択肢から選ぶラジオボタンも GTK+ ではボタンのサブクラスになっています。

GtkButton

GtkButton は標準的なボタンです。
クリックすると clicked シグナルが発生しますのでハンドラを書いて処理を行います。

PyGtk 互換でストックとニーモニック指定が可能ですが use_underline=False になっている。
ただこの書き方は PyGtk を知っている人にしか通用しないので new を利用したほうがいいと思う。
# PyGtk
gtk.Button(label=None, stock=None, use_underline=True)
# PyGI
Gtk.Button(label=None, stock=None, use_underline=False)
use_underline は Alt + 指定キーでボタンを押せるニーモニックです。
new_with_mnemonic で作成するか use_underline を行えば指定することができます。
#!/usr/bin/env python3

from gi.repository import Gtk

class ButtonWin(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("delete-event", Gtk.main_quit)
        # PyGtk 互換は use_underline=False になっている
        abutton = Gtk.Button("Alt + _A でクリック", None, True)
        abutton.connect("clicked", self.on_clicked)
        # new_with_mnemonic
        bbutton = Gtk.Button.new_with_mnemonic("Alt + _B でクリック")
        bbutton.connect("clicked", self.on_clicked)
        # new_with_label
        cbutton = Gtk.Button.new_with_label("Alt + _Z で何も起こらない")
        cbutton.connect("clicked", self.on_clicked)
        # stock は勝手にデフォルトニーモニックになる
        dbutton = Gtk.Button.new_from_stock(Gtk.STOCK_CLOSE)
        dbutton.connect("clicked", Gtk.main_quit)
        #
        vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
        vbox.pack_start(abutton, False, False, 0)
        vbox.pack_start(bbutton, False, False, 0)
        vbox.pack_start(cbutton, False, False, 0)
        vbox.pack_start(dbutton, False, False, 0)
        self.add(vbox)
        self.show_all()

    def on_clicked(self, widget):
        s = widget.get_label()
        widget.set_label(s + "押した")

if __name__ == "__main__":
    ButtonWin()
    Gtk.main()

img/button.png

GtkToggleButton

GtkToggleButton は GtkButton のサブクラスです。
クリックするともう一度クリックするまで凹んだままになります。
凹んでいるかの on off 状態判別に利用します。
#!/usr/bin/env python3

from gi.repository import Gtk

labels = ("_ON", "_OFF")

class ButtonWin(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("delete-event", Gtk.main_quit)
        # ToggleButton
        toggle = Gtk.ToggleButton.new_with_mnemonic("")
        toggle.connect("toggled", self.on_toggled)
        toggle.set_active(True)
        self.add(toggle)
        self.show_all()

    def on_toggled(self, widget):
        if widget.get_active():
            widget.set_label(labels[0])
        else:
            widget.set_label(labels[1])

if __name__ == "__main__":
    ButtonWin()
    Gtk.main()

img/toggle.png

GtkCheckButton

GtkCheckButton は基本的に GtkToggleButton と変わりません。
GtkToggleButton のサブクラスですが見た目が変わった程度だと思ってください。
上のサンプルコードの ToggleButton を CheckButton に変えれば解ります。

img/check.png

GtkRadioButton

GtkRadioButton は複数用意してユーザーに選択させる Widget です。
グループを作るのに List を使う方法もありますが new_with_label_from_widget が簡単。
最初に None 指定で作り以降はその RadioButton を引数に入れグループにしていきます。
GtkCheckButton のサブクラスなので toggled シグナルも使えます。

下記は終了時に選択ラジオボタンの文字列を書き出すサンプル。
#!/usr/bin/env python3

from gi.repository import Gtk

class ButtonWin(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        # RadioButton
        cbr = Gtk.RadioButton.new_with_label_from_widget(None, "CBR250R")
        nin = Gtk.RadioButton.new_with_label_from_widget(cbr, "Ninja250")
        gsr = Gtk.RadioButton.new_with_label_from_widget(cbr, "GSR250")
        # 終了時に選択したラジオボタンのテキストを print
        radio_list = [cbr, nin, gsr]
        self.connect("delete-event", self.on_quit, radio_list)
        #
        vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
        vbox.pack_start(cbr, False, False, 0)
        vbox.pack_start(nin, False, False, 0)
        vbox.pack_start(gsr, False, False, 0)
        self.add(vbox)
        self.show_all()

    def on_quit(self, widget, event, radio_list):
        for radio in radio_list:
            if radio.get_active():
                print(radio.get_label())
                break
        Gtk.main_quit()

if __name__ == "__main__":
    ButtonWin()
    Gtk.main()

img/radio.png

GtkSwitch

GtkSwitch は GTK3 から追加された Widget で on off 判定に特化したもの。
操作してもシグナルは発行されません、bool 値を同期させるのに利用します。
Widget 間だけでなく gsetting の値も同期できます。
又バインド(同期)は双方向、片方向で選べます。

一応 notify::active でシグナルも使えるようにはしているようです。
switch.connect("notify::active", self.on_activate)
下記は片方の Widget を ON/OFF するともう片方も追従するサンプルです。
#!/usr/bin/env python3

from gi.repository import GObject, Gtk

class ButtonWin(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("delete-event", Gtk.main_quit)
        # GtkSwitch と GtkCheckButton のプロパティをを同期
        switch = Gtk.Switch()
        check = Gtk.CheckButton("Check")
        GObject.Binding.bind_property(
                switch, "active",
                check, "active",
                GObject.BindingFlags.BIDIRECTIONAL )
        #
        hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
        hbox.pack_start(switch, False, False, 0)
        hbox.pack_start(check, False, False, 0)
        self.add(hbox)
        self.show_all()

if __name__ == '__main__':
    ButtonWin()
    Gtk.main()

img/gtk_switch.png

GtkLinkButton

GtkLinkButton はクリックすると gvfs-open にて指定 URI を開く Widget です。
下記は画像 URI と WWW URL を指定した場合です。
#!/usr/bin/env python3

from gi.repository import Gtk

class ButtonWin(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("delete-event", Gtk.main_quit)
        # file:// で画像指定なら標準画像ビューアで開く
        f = Gtk.LinkButton.new("file:///usr/share/icons/gnome/256x256/status/computer-fail.png")
        # http:// なら標準 WWW ブラウザで URL を開く
        u = Gtk.LinkButton.new("http://localhost")
        vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
        vbox.pack_start(f, False, False, 0)
        vbox.pack_start(u, False, False, 0)
        self.add(vbox)
        self.show_all()

if __name__ == '__main__':
    ButtonWin()
    Gtk.main()

img/gtk_linkbutton.png
Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.