# ButtonBox (Python)

Marta Maria Casetti
mmcasetti@gmail.com 2012
단추를 정렬하는 컨테이너
조성호
shcho@gnome.org 2017-2019.

# ButtonBox

계산기 - 단추는 수평 ButtonBox에 둘러싸여있습니다.

# 예제 결과를 만드는 코드

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)

# ButtonBox 위젯에 쓸만한 메서드

ButtonBox 배치는 `set_layout(layout)` 함수로 설정하며, `layout`에 들어갈 값은 `Gtk.ButtonBoxStyle.SPREAD`(단추가 상자 크기만큼 늘어남), `Gtk.ButtonBoxStyle.EDGE`(단추가 상자 가장자리에 붙음), `Gtk.ButtonBoxStyle.START`(단추가 상자 시작 부분에 모임), `Gtk.ButtonBoxStyle.END`(단추가 상자 끝부분에 모임), `Gtk.ButtonBoxStyle.CENTER`(단추가 상자 한가운데로 모임)가 될 수 있습니다.

`set_child_secondary(button, is_secondary)` 함수로 `button` 이 하위 두번째 모임으로 나타날지 여부를 설정합니다. 2차 하위요소는 대화상자의 도움말 단추가 될 수 있습니다. 이 모임은 모양새가 `START`, `SPREAD`, `EDGE` 중 하나고, 그 이전 하위 요소의 모양새가 `END`일 때, 다른 하위 요소의 전에 나타납니다. 모양새가 `START`, `END` 중 하나면, 주 하위 요소의 단추 상자 다른 끝부분에 두번째 하위 요소를 정렬합니다. 다른 모양새로 설정하면, 주 하위 요소 바로 다음에 나타냅니다.

`set_child_non_homogeneous(button, is_non_homogeneous)` 함수로 하위 요소에 대한 동일 크기 조절 방식 비적용 여부를 설정합니다. 기본 값은 `false`입니다.

`set_spacing(spacing)` 함수는 상자안의 단추 사이 간격을 픽셀 단위로 설정합니다.

# API 참고서

이 예제는 다음 참고자료가 필요합니다:

GtkButtonBox

GtkBox

GtkButton

GtkEntry

GtkGrid