ButtonBox (Python) Marta Maria Casetti mmcasetti@gmail.com 2012 Ένας περιέκτης για διευθέτηση κουμπιών Ελληνική μεταφραστική ομάδα GNOME team@gnome.gr 2012-2015 Δημήτρης Σπίγγος dmtrs32@gmail.com 2012, 2013 Μαρία Θουκιδίδου marablack3@gmail.com 2014 Θάνος Τρυφωνίδης tomtryf@gmail.com 2014, 2015 ButtonBox

Μια αριθμομηχανή - τα κουμπιά περικλείονται σε οριζόντια ButtonBoxes.

Ο χρησιμοποιούμενος κώδικας για παραγωγή αυτού παραδείγματος 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 πρέπει να εμφανιστεί σε μια δευτερεύουσα ομάδα θυγατρικών. Μια τυπική χρήση ενός δευτερεύοντος θυγατρικού είναι το βοηθητικό κουμπί σε ένα διάλογο. Αυτή η ομάδα εμφανίζεται μετά τα άλλα θυγατρικά εάν ο τύπος είναι START, SPREAD ή EDGE και πριν τα άλλα θυγατρικά εάν ο τύπος είναι END. Εάν ο τύπος είναι START ή END, τότε τα δευτερεύοντα θυγατρικά στοιχίζονται στην άλλη άκρη του πλαισίου κουμπιού από τα κύρια θυγατρικά. Για τους άλλους τύπους, εμφανίζονται αμέσως δίπλα στα κύρια θυγατρικά.

Το set_child_non_homogeneous(button, is_non_homogeneous) ορίζει εάν το θυγατρικό εξαιρείται από το ομογενές μέγεθος. Προεπιλεγμένη τιμή είναι False.

set_spacing(spacing) ορίζει το διάκενο, σε εικονοστοιχεία, μεταξύ των κουμπιών του πλαισίου.

Αναφορές API

Σε αυτό το παράδειγμα χρησιμοποιήσαμε τα παρακάτω:

GtkButtonBox

GtkBox

GtkButton

GtkEntry

GtkGrid