8. Button Widgets¶
8.1. Button¶
The Button widget is another commonly used widget. It is generally used to attach a function that is called when the button is pressed.
The Gtk.Button
widget can hold any valid child widget. That is it can
hold most any other standard Gtk.Widget
. The most commonly used child
is the Gtk.Label
.
Usually, you want to connect to the button’s “clicked” signal which is emitted when the button has been pressed and released.
8.1.1. Example¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
|
8.2. ToggleButton¶
A Gtk.ToggleButton
is very similar to a normal Gtk.Button
,
but when clicked they remain activated, or pressed, until clicked again.
When the state of the button is changed, the “toggled” signal is emitted.
To retrieve the state of the Gtk.ToggleButton
, you can use the
Gtk.ToggleButton.get_active()
method. This returns True
if the button
is “down”. You can also set the toggle button’s state, with
Gtk.ToggleButton.set_active()
. Note that, if you do this, and the state
actually changes, it causes the “toggled” signal to be emitted.
8.2.1. Example¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
|
8.3. CheckButton¶
Gtk.CheckButton
inherits from Gtk.ToggleButton
. The only real
difference between the two is Gtk.CheckButton
‘s appearance.
A Gtk.CheckButton
places a discrete Gtk.ToggleButton
next to
a widget, (usually a Gtk.Label
).
The “toggled” signal, Gtk.ToggleButton.set_active()
and
Gtk.ToggleButton.get_active()
are inherited.
8.4. RadioButton¶
Like checkboxes, radio buttons also inherit from Gtk.ToggleButton
,
but these work in groups, and only one Gtk.RadioButton
in a group can
be selected at any one time. Therefore, a Gtk.RadioButton
is one way
of giving the user a choice from many options.
Radio buttons can be created with one of the static methods
Gtk.RadioButton.new_from_widget()
,
Gtk.RadioButton.new_with_label_from_widget()
or
Gtk.RadioButton.new_with_mnemonic_from_widget()
.
The first radio button in a group will be created passing None
as the
group argument. In subsequent calls, the group you
wish to add this button to should be passed as an argument.
When first run, the first radio button in the group will be active.
This can be changed by calling Gtk.ToggleButton.set_active()
with True
as first argument.
Changing a Gtk.RadioButton
‘s widget group after its creation can be
achieved by calling Gtk.RadioButton.join_group()
.
8.4.1. Example¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
|
8.5. LinkButton¶
A Gtk.LinkButton
is a Gtk.Button
with a hyperlink, similar
to the one used by web browsers, which triggers an action when clicked. It is
useful to show quick links to resources.
The URI bound to a Gtk.LinkButton
can be set specifically using
Gtk.LinkButton.set_uri()
, and retrieved using Gtk.LinkButton.get_uri()
.
8.5.1. Example¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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("http://www.gtk.org", "Visit GTK+ Homepage")
self.add(button)
win = LinkButtonWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
|
8.6. SpinButton¶
A Gtk.SpinButton
is an ideal way to allow the user to set the value of
some attribute. Rather than having to directly type a number into a
Gtk.Entry
, Gtk.SpinButton
allows the user to click on one of
two arrows to increment or decrement the displayed value. A value can still be
typed in, with the bonus that it can be checked to ensure it is in a given range.
The main properties of a Gtk.SpinButton
are set through
Gtk.Adjustment
.
To change the value that Gtk.SpinButton
is showing, use
Gtk.SpinButton.set_value()
. The value entered can either be an integer or
float, depending on your requirements, use Gtk.SpinButton.get_value()
or
Gtk.SpinButton.get_value_as_int()
, respectively.
When you allow the displaying of float values in the spin button, you may wish
to adjust the number of decimal spaces displayed by calling
Gtk.SpinButton.set_digits()
.
By default, Gtk.SpinButton
accepts textual data. If you wish to limit
this to numerical values only, call Gtk.SpinButton.set_numeric()
with True
as argument.
We can also adjust the update policy of Gtk.SpinButton
. There are two
options here; by default the spin button updates the value even if the data
entered is invalid. Alternatively, we can set the policy to only update when the
value entered is valid by calling Gtk.SpinButton.set_update_policy()
.
8.6.1. Example¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
|
8.7. Switch¶
A Gtk.Switch
is a widget that has two states: on or off. The user can
control which state should be active by clicking the empty area, or by dragging
the handle.
You shouldn’t use the “activate” signal on the Gtk.Switch which is an action signal and emitting it causes the switch to animate. Applications should never connect to this signal, but use the “notify::active” signal, see the example here below.
8.7.1. Example¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
|