ButtonBox (Python) Marta Maria Casetti mmcasetti@gmail.com 2012 A container for arranging buttons Rafael Ferreira rafael.f.f1@gmail.com 2013 ButtonBox

A calculator - the buttons are enclosed in horizontal ButtonBoxes.

Code used to generate this example from gi.repository import Gtk import sys class MyWindow(Gtk.ApplicationWindow): def __init__(self, app): Gtk.Window.__init__(self, title="Calculator", application=app) self.set_default_size(350, 200) self.set_border_width(10) # an entry self.entry = Gtk.Entry() # with an initial text self.entry.set_text('0') # text aligned on the right self.entry.set_alignment(1) # the text in the entry cannot be modified writing in it self.entry.set_can_focus(False) # a grid grid = Gtk.Grid() grid.set_row_spacing(5) # to attach the entry grid.attach(self.entry, 0, 0, 1, 1) # the labels for the buttons buttons = [7, 8, 9, '/', 4, 5, 6, '*', 1, 2, 3, '-', 'C', 0, '=', '+'] # each row is a ButtonBox, attached to the grid for i in range(4): hbox = Gtk.ButtonBox.new(Gtk.Orientation.HORIZONTAL) hbox.set_spacing(5) grid.attach(hbox, 0, i + 1, 1, 1) # each ButtonBox has 4 buttons, connected to the callback function for j in range(4): button = Gtk.Button(label=buttons[i * 4 + j]) button.set_can_focus(False) button.connect("clicked", self.button_clicked) hbox.add(button) # some variables for the calculations self.first_number = 0 self.second_number = 0 self.counter = 0 self.operation = "" # add the grid to the window self.add(grid) # callback function for all the buttons def button_clicked(self, button): # for the operations if button.get_label() == '+': self.counter += 1 if self.counter > 1: self.do_operation() self.entry.set_text('0') self.operation = "plus" elif button.get_label() == '-': self.counter += 1 if self.counter > 1: self.do_operation() self.entry.set_text('0') self.operation = "minus" elif button.get_label() == '*': self.counter += 1 if self.counter > 1: self.do_operation() self.entry.set_text('0') self.operation = "multiplication" elif button.get_label() == '/': self.counter += 1 if self.counter > 1: self.do_operation() self.entry.set_text('0') self.operation = "division" # for = elif button.get_label() == '=': self.do_operation() self.entry.set_text(str(self.first_number)) self.counter = 1 # for Cancel elif button.get_label() == 'C': self.first_number = 0 self.second_number = 0 self.counter = 0 self.entry.set_text('') self.operation = "" # for a digit button else: new_digit = int(button.get_label()) if self.entry.get_text() == 'error': number = 0 else: number = int(self.entry.get_text()) number = number * 10 + new_digit if self.counter == 0: self.first_number = number else: self.second_number = number self.entry.set_text(str(number)) def do_operation(self): if self.operation == "plus": self.first_number += self.second_number elif self.operation == "minus": self.first_number -= self.second_number elif self.operation == "multiplication": self.first_number *= self.second_number elif self.operation == "division": try: self.first_number /= self.second_number except ZeroDivisionError: self.first_number = 0 self.second_number = 0 self.counter = 0 self.entry.set_text('error') self.operation = "" return else: self.first_number = 0 self.second_number = 0 self.counter = 0 self.entry.set_text('error') class MyApplication(Gtk.Application): def __init__(self): Gtk.Application.__init__(self) def do_activate(self): win = MyWindow(self) win.show_all() def do_startup(self): Gtk.Application.do_startup(self) app = MyApplication() exit_status = app.run(sys.argv) sys.exit(exit_status)
Useful methods for a ButtonBox widget

The layout of the ButtonBox are set with set_layout(layout), where layout can be Gtk.ButtonBoxStyle.SPREAD (buttons are evenly spread across the box), Gtk.ButtonBoxStyle.EDGE (buttons are placed at the edges of the box), Gtk.ButtonBoxStyle.START (buttons are grouped towards the start of the box), Gtk.ButtonBoxStyle.END (buttons are grouped towards the end of the box), Gtk.ButtonBoxStyle.CENTER (buttons are centered in the box).

set_child_secondary(button, is_secondary) sets whether button should appear in a secondary group of children. A typical use of a secondary child is the help button in a dialog. This group appears after the other children if the style is START, SPREAD or EDGE, and before the other children if the style is END. If the style is START or END, then the secondary children are aligned at the other end of the button box from the main children. For the other styles, they appear immediately next to the main children.

set_child_non_homogeneous(button, is_non_homogeneous) sets whether the child is exempted from homogeneous sizing. Default value is False.

set_spacing(spacing) sets the spacing, in pixels, between the buttons of the box.

API References

In this sample we used the following:

GtkButtonBox

GtkBox

GtkButton

GtkEntry

GtkGrid