Python GTK+3 チュートリアル

09. ボタンウィジェット

翻訳して勉強するGtkチュートリアル第9章 Button Widgets です。


9.1. ボタン

ボタンウィジェットもよく使われるウィジェットです。一般的に、ボタンが押されたときに呼び出される関数を追加するために使用されます。

Gtk.Button ウィジェットは有効な子ウィジェットを保持できます。つまり、他のほとんどの標準的な Gtk.Widget を保持することができます。最もよく使われる子ウィジェットは Gtk.Label です。

通常は、ボタンが押された時と離された時に発せられる、ボタンの「クリックされた」というシグナルに何らかの関数を接続させたいでしょう。

9.1.1. 例

ボタン
import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class ButtonWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Button Demo")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=6)
        self.add(hbox)

        button = Gtk.Button.new_with_label("Click Me")
        button.connect("clicked", self.on_click_me_clicked)
        hbox.pack_start(button, True, True, 0)

        button = Gtk.Button.new_with_mnemonic("_Open")
        button.connect("clicked", self.on_open_clicked)
        hbox.pack_start(button, True, True, 0)

        button = Gtk.Button.new_with_mnemonic("_Close")
        button.connect("clicked", self.on_close_clicked)
        hbox.pack_start(button, True, True, 0)

    def on_click_me_clicked(self, button):
        print('"Click me" button was clicked')

    def on_open_clicked(self, button):
        print('"Open" button was clicked')

    def on_close_clicked(self, button):
        print("Closing application")
        Gtk.main_quit()


win = ButtonWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

9.2. トグルボタン

Gtk.ToggleButton は通常の Gtk.Button と非常によく似ていますが、クリック後、再度クリックされるまで有効になったまま、あるいは押されたままになります。ボタンの状態が変更されると、“toggled” シグナルが発せられます。

Gtk.ToggleButton の状態を取得するには、Gtk.ToggleButton.get_active() メソッドを使用します。これは、ボタンが “down” であれば True を返します。また、Gtk.ToggleButton.set_active() でトグルボタンの状態を設定することもできます。これを実行して実際に状態が変化した場合、“toggled” シグナルが発生することに注意してください。

9.2.1. 例

トグルボタン
import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class ToggleButtonWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="ToggleButton Demo")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=6)
        self.add(hbox)

        button = Gtk.ToggleButton("Button 1")
        button.connect("toggled", self.on_button_toggled, "1")
        hbox.pack_start(button, True, True, 0)

        button = Gtk.ToggleButton("B_utton 2", use_underline=True)
        button.set_active(True)
        button.connect("toggled", self.on_button_toggled, "2")
        hbox.pack_start(button, True, True, 0)

    def on_button_toggled(self, button, name):
        if button.get_active():
            state = "on"
        else:
            state = "off"
        print("Button", name, "was turned", state)


win = ToggleButtonWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

9.3. チェックボタン

Gtk.CheckButton Gtk.ToggleButton を継承しています。この2つの違いは Gtk.CheckButton の外観だけです。Gtk.CheckButton は、個別の Gtk.ToggleButton をウィジェット (通常は Gtk.Label) の隣に配置します。“toggled” シグナル・ Gtk.ToggleButton.set_active() Gtk.ToggleButton.get_active() は継承されます。


9.4. ラジオボタン

チェックボックスと同様に、ラジオボタンも Gtk.ToggleButton を継承していますが、これらはグループで動作し、一度に選択できるのはグループ内の一つの Gtk.RadioButton だけです。したがって、Gtk.RadioButton はユーザに多くの選択肢の中から選択させるための一つの方法となります。

ラジオボタンは静的メソッド Gtk.RadioButton.new_from_widget()Gtk.RadioButton.new_with_label_from_widget()、または Gtk.RadioButton.new_with_mnemonic_from_widget() のいずれかで作成することができます。グループの最初のラジオボタンは、グループの引数として None を渡して作成されます。それ以降の呼び出しでは、このボタンを追加したいグループを引数に渡す必要があります。

最初の実行ではグループ内の初めのラジオボタンがアクティブになります。これは、最初の引数に True を指定して Gtk.ToggleButton.set_active() を呼び出すことで変更できます。

作成後に Gtk.RadioButton のウィジェットグループを変更するには、Gtk.RadioButton.join_group() を呼び出す必要があります。

9.4.1. 例

ラジオボタン
# tut09-04.py
# ラジオボタン

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class RadioButtonWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="RadioButton Demo")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=6)
        self.add(hbox)

        button1 = Gtk.RadioButton.new_with_label_from_widget(None, "Button 1")
        button1.connect("toggled", self.on_button_toggled, "1")
        hbox.pack_start(button1, False, False, 0)

        button2 = Gtk.RadioButton.new_from_widget(button1)
        button2.set_label("Button 2")
        button2.connect("toggled", self.on_button_toggled, "2")
        hbox.pack_start(button2, False, False, 0)

        button3 = Gtk.RadioButton.new_with_mnemonic_from_widget(button1, "B_utton 3")
        button3.connect("toggled", self.on_button_toggled, "3")
        hbox.pack_start(button3, False, False, 0)

    def on_button_toggled(self, button, name):
        if button.get_active():
            state = "on"
        else:
            state = "off"
        print("Button", name, "was turned", state)


win = RadioButtonWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

9.5. リンクボタン

Gtk.LinkButton はハイパーリンクを持つ Gtk.Button で、ブラウザで使われているものに似ています。リソースへのクイックリンクを表示するのに便利です。

Gtk.LinkButton にバインドされた URI は、Gtk.LinkButton.set_uri() で指定し、Gtk.LinkButton.get_uri() で取得することができます。

9.5.1. 例

リンクボタン
# tut09-05.py
# リンクボタン

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class LinkButtonWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="LinkButton Demo")
        self.set_border_width(10)

        button = Gtk.LinkButton("https://www.gtk.org", "Visit GTK+ Homepage")
        self.add(button)


win = LinkButtonWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

9.6. スピンボタン

Gtk.SpinButton は、ユーザが属性の値を設定するための理想的な方法です。Gtk.Entry に直接数値を入力するのではなく、Gtk.SpinButton を使うことで、ユーザは2つの矢印のうちの1つをクリックして、表示されている値を増減させることができます。値を入力させ、その値が指定した範囲内にあるかどうかをチェックできるという利点もあります。Gtk.SpinButton の主なプロパティは Gtk.Adjustment で設定されます。

Gtk.SpinButton が表示している値を変更するには、Gtk.SpinButton.set_value() を使用します。入力される値は整数か浮動小数点のどちらかで、必要に応じて Gtk.SpinButton.get_value() または Gtk.SpinButton.get_value_as_int() を使用します。

スピンボタンで float 値の表示を許可している場合は、Gtk.SpinButton.set_digits() を呼び出して表示される小数点以下の桁数を調整したいこともあるでしょう。

Gtk.SpinButton は、デフォルトではテキストデータを受け付けます。数値のみに限定したい場合は、引数に True を指定して Gtk.SpinButton.set_numeric() を呼び出してください。

Gtk.SpinButton の更新ポリシーを調整することもできます。ここには2つのオプションがあります。デフォルトでは入力されたデータが無効な場合でもスピンボタンは値を更新します。あるいは、Gtk.SpinButton.set_update_policy() を呼び出すことで、入力された値が有効な場合のみ更新するようにポリシーを設定することもできます。

9.6.1. 例

スピンボタン
# tut09-06.py
# スピンボタン

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class SpinButtonWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="SpinButton Demo")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=6)
        self.add(hbox)

        adjustment = Gtk.Adjustment(0, 0, 100, 1, 10, 0)
        self.spinbutton = Gtk.SpinButton()
        self.spinbutton.set_adjustment(adjustment)
        hbox.pack_start(self.spinbutton, False, False, 0)

        check_numeric = Gtk.CheckButton("Numeric")
        check_numeric.connect("toggled", self.on_numeric_toggled)
        hbox.pack_start(check_numeric, False, False, 0)

        check_ifvalid = Gtk.CheckButton("If Valid")
        check_ifvalid.connect("toggled", self.on_ifvalid_toggled)
        hbox.pack_start(check_ifvalid, False, False, 0)

    def on_numeric_toggled(self, button):
        self.spinbutton.set_numeric(button.get_active())

    def on_ifvalid_toggled(self, button):
        if button.get_active():
            policy = Gtk.SpinButtonUpdatePolicy.IF_VALID
        else:
            policy = Gtk.SpinButtonUpdatePolicy.ALWAYS
        self.spinbutton.set_update_policy(policy)


win = SpinButtonWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

9.7. スイッチ

Gtk.Switch は、オンとオフの2つの状態を持つウィジェットです。ユーザは空の領域をクリックしたり、ハンドルをドラッグしたりすることで、どちらの状態を有効にするかを制御できます。

Gtk.Switch に “activate” シグナルを使うべきではありません。これはアクションシグナルであり、これを発することでスイッチがアニメーションします。アプリケーションは決してこのシグナルに接続せず、“notify::active” シグナルを使うべきです。以下の例を参照してください。

9.7.1. 例

スイッチ
# tut09-07.py
# スイッチ

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class SwitcherWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Switch Demo")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=6)
        self.add(hbox)

        switch = Gtk.Switch()
        switch.connect("notify::active", self.on_switch_activated)
        switch.set_active(False)
        hbox.pack_start(switch, True, True, 0)

        switch = Gtk.Switch()
        switch.connect("notify::active", self.on_switch_activated)
        switch.set_active(True)
        hbox.pack_start(switch, True, True, 0)

    def on_switch_activated(self, switch, gparam):
        if switch.get_active():
            state = "on"
        else:
            state = "off"
        print("Switch was turned", state)


win = SwitcherWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()


関連記事