# ButtonBox (Python)

Marta Maria Casetti
mmcasetti@gmail.com 2012
Kontejner pro uspořádání tlačítek

# ButtonBox

Kalkulačka – tlačítka jsou umístěna do vodorovných widgetů ButtonBox.

# Kód použitý k vygenerování tohoto příkladu

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)

# Vstupní pole self.entry = Gtk.Entry() # s počátečním textem self.entry.set_text('0') # zarovnaným doprava self.entry.set_alignment(1) # Text v poli nemůže bý změněn psaním self.entry.set_can_focus(False)

# Mřížka grid = Gtk.Grid() grid.set_row_spacing(5)

# do které se připojí vstupní pole grid.attach(self.entry, 0, 0, 1, 1)

# Popisky pro tlačítka buttons = [7, 8, 9, '/', 4, 5, 6, '*', 1, 2, 3, '-', 'C', 0, '=', '+']

# Každý z řádků je ButtonBox připojený do mřížky for i in range(4): hbox = Gtk.ButtonBox.new(Gtk.Orientation.HORIZONTAL) hbox.set_spacing(5) grid.attach(hbox, 0, i + 1, 1, 1) # Každý ButtonBox má 4 tlačíka napojená na funkci zpětného volání 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)

# Pár proměnných pro výpočty self.first_number = 0 self.second_number = 0 self.counter = 0 self.operation = ""

# Přidá mřížku do okna self.add(grid)

# Funkce zpětného volání pro všechna tlačítka def button_clicked(self, button): # Pro početní operace 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" # Pro = elif button.get_label() == '=': self.do_operation() self.entry.set_text(str(self.first_number)) self.counter = 1 # Pro Zrušit elif button.get_label() == 'C': self.first_number = 0 self.second_number = 0 self.counter = 0 self.entry.set_text('') self.operation = "" # Pro číslice 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)

# Užitečné metody pro widget ButtonBox

Rozvržení widgetu ButtonBox se nastavuje pomocí `set_layout(rozvržení)`, kde `rozvržení` může být `Gtk.ButtonBoxStyle.SPREAD` (tlačítka jsou v boxu rovnoměrně rozložená), `Gtk.ButtonBoxStyle.EDGE` (tlačítka jsou umístěna u hran boxu), `Gtk.ButtonBoxStyle.START` (tlačítka jsou seskupena na začátku boxu), `Gtk.ButtonBoxStyle.END` (tlačítka jsou seskupena na konci boxu), `Gtk.ButtonBoxStyle.CENTER` (tlačítka jsou na středu boxu).

`set_child_secondary(tlačítko, je_druhé)` nastavuje, že `tlačítko` se má objevit v druhé skupině potomků. Typické použití jako druhého tlačítka je tlačítko nápověda v dialogovém okně. Tato skupina se objeví za ostatními potomky v případě, že styl je `START`, `SPREAD` or `EDGE`, a nebo před ostatními potomky, v případě že styl je `END`. Pokud je styl `START` nebo `END`, je druhý potomek zarovnán k opačnému konci tlačítkového boxu než hlavní potomek. Pro ostatní styly se objeví hned vedle hlavního potomka.

`set_child_non_homogeneous(tlačítko, není_homogení)` nastavuje, že potomek je vynechán z homogenního nastavení velikosti. Výchozí hodnota je `False`.

`set_spacing(rozestup)` nastaví rozestup, v pixelech, mezi tlačítky v boxu.

# Odkazy k API

V této ukázce se používá následující:

GtkButtonBox

GtkBox

GtkButton

GtkEntry

GtkGrid