# Η εργαλειοθήκη δημιουργήθηκε χρησιμοποιώντας Glade (Python)

Tiffany Antopolski
tiffany.antopolski@gmail.com 2012
Marta Maria Casetti
mmcasetti@gmail.com 2012
Sebastian Pölsterl
sebp@k-d-w.org 2011
Μια γραμμή κουμπιών και άλλα γραφικά στοιχεία
Ελληνική μεταφραστική ομάδα GNOME
team@gnome.gr 2012-2015
Δημήτρης Σπίγγος
dmtrs32@gmail.com 2012, 2013
Μαρία Θουκιδίδου
marablack3@gmail.com 2014
Θάνος Τρυφωνίδης
tomtryf@gmail.com 2014, 2015

# Η γραμμή εργαλείων δημιουργήθηκε χρησιμοποιώντας Glade

Αυτό το παράδειγμα είναι παρόμοιο με , εκτός από τη χρήση Glade για δημιουργία της εργαλειοθήκης σε ένα αρχείο XML .ui.

# Δημιουργία της εργαλειοθήκης με Glade

Για δημιουργία της γραμμής εργαλείων χρησιμοποιώντας το σχεδιαστή διεπαφής Glade:

Άνοιγμα του Glade και αποθήκευση του αρχείου ως toolbar_builder.ui

Στιγμιότυπο διεπαφής του Glade

Στο περιέκτες στα αριστερά, δεξί πάτημα στην εργαλειοθήκη και επιλογή προσθήκη γραφικού στοιχείου ως ανώτατου επιπέδου.

Στιγμιότυπο του εικονιδίου εργαλειοθήκης στο Glade ui

Στην καρτέλα γενικά στα κάτω δεξιά, αλλαγή του ονόματος σε γραμμή εργαλείων και εμφάνιση βέλους σε όχι.

Στιγμιότυπο της καρτέλας Γενικά

Στην καρτέλα κοινά, ορίστε οριζόντια επέκταση σε ναι.

Στιγμιότυπο της καρτέλας Κοινά

Δεξί κλικ στη γραμμή εργαλείων στα πάνω δεξιά και επιλέξτε επεξεργασία. Το παράθυρο επεξεργαστής γραμμής εργαλείων θα εμφανιστεί.

Στιγμιότυπο πού να δεξιοπατήσετε για να επεξεργαστείτε την εργαλειοθήκη.

Θέλουμε να προσθέσουμε 5 κουμπιά εργαλείων: νέο, άνοιγμα, αναίρεση, πλήρης οθόνη και εγκατάλειψη πλήρους οθόνης. Πρώτα, θα προσθέσουμε το νέο ToolButton.

Στην καρτέλα ιεραρχία, πατήστε προσθήκη.

Αλλαγή του ονόματος του στοιχείου εργαλείου σε new_button.

Κύλιση προς τα κάτω και ρύθμιση του είναι σημαντικό σε ναι. Αυτό θα προκαλέσει την ετικέτα του ToolButton να εμφανιστεί, όταν προβάλετε τη γραμμή εργαλείων.

Εισάγετε το όνομα ενέργειας: app.new.

Αλλαγή του ετικέτα σε New.

Επιλογή του νέου αναγνωριστικού παρακαταθήκης από το πτυσσόμενο μενού, ή πληκτρολογήστε gtk-new.

Επανάληψη των παραπάνω βημάτων για τα υπολειπόμενα κουμπιά εργαλείων (ToolButtons), με τις παρακάτω ιδιότητες:

Όνομα | Είναι σημαντικό | Όνομα ενέργειας | Ετικέτα | Αναγνωριστικό παρακαταθήκης
--- | --- | --- | --- | ---
open_button | Ναι | app.open | Open | gtk-open
undo_button | Ναι | win.undo | Αναίρεση | gtk-undo
fullscreen_button | Ναι | win.fullscreen | Πλήρης οθόνη | gtk-fullscreen
leave_fullscreen_button | Ναι | win.fullscreen | Έξοδος από πλήρη οθόνη | gtk-leave-fullscreen

Κλείσιμο του επεξεργαστή γραμμής εργαλείων.

Όταν το πρόγραμμά μας θα ξεκινήσει στην αρχή, δεν θέλουμε το κουμπί εργαλείου (ToolButton) Έξοδος από πλήρη οθόνη να είναι ορατό, αφού η εφαρμογή δεν θα είναι σε λειτουργία πλήρους οθόνης. Μπορείτε να το ρυθμίσετε στην καρτέλα κοινά, πατώντας στην ιδιότητα ορατό σε όχι. Το κουμπί εργαλείου θα εξακολουθεί να εμφανίζεται στον σχεδιαστή διεπαφής, αλλά θα συμπεριφέρεται σωστά, όταν το αρχείο φορτώνεται στον κώδικα προγράμματός σας. Σημειώστε ότι η μέθοδος `show_all()` θα αντικαταστήσει αυτή τη ρύθμιση - έτσι στον κώδικα πρέπει να χρησιμοποιήσουμε `show()` ξεχωριστά σε όλα τα στοιχεία.

Ορισμός της ιδιότητας ορατό σε Όχι

Αποθήκευση της εργασίας σας και κλείσιμο του Glade.

Το δημιουργημένο αρχείο XML από το Glade εμφανίζεται παρακάτω. Αυτή είναι η περιγραφή της εργαλειοθήκης. Τη στιγμή της εγγραφής, η επιλογή προσθήκης στην κλάση Gtk.STYLE_CLASS_PRIMARY_TOOLBAR στην διεπαφή Glade δεν υπάρχει. Μπορούμε χειροκίνητα να το προσθέσουμε στο αρχείο XML. Για να το κάνουμε, προσθέστε τον παρακάτω κώδικα XML στη γραμμή 9 του toolbar_builder.ui:

<style> <class name="primary-toolbar"/> </style>

Εάν δεν το προσθέσετε, το πρόγραμμα θα εξακολουθήσει να δουλεύει υπέροχα. Η τελική εργαλειοθήκη όμως θα φαίνεται ελαφρά διαφορετική τότε από το στιγμιότυπο στην κορυφή αυτής της σελίδας.

<?xml version="1.0" encoding="UTF-8"?> <interface> <!-- interface-requires gtk+ 3.0 --> <object class="GtkToolbar" id="toolbar"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="hexpand">True</property> <property name="show_arrow">False</property> <child> <object class="GtkToolButton" id="new_button"> <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_action_appearance">False</property> <property name="is_important">True</property> <property name="action_name">app.new</property> <property name="label" translatable="yes">New</property> <property name="use_underline">True</property> <property name="stock_id">gtk-new</property> </object> <packing> <property name="expand">False</property> <property name="homogeneous">True</property> </packing> </child> <child> <object class="GtkToolButton" id="open_button"> <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_action_appearance">False</property> <property name="is_important">True</property> <property name="action_name">app.open</property> <property name="label" translatable="yes">Open</property> <property name="use_underline">True</property> <property name="stock_id">gtk-open</property> </object> <packing> <property name="expand">False</property> <property name="homogeneous">True</property> </packing> </child> <child> <object class="GtkToolButton" id="undo_button"> <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_action_appearance">False</property> <property name="is_important">True</property> <property name="action_name">win.undo</property> <property name="label" translatable="yes">Undo</property> <property name="use_underline">True</property> <property name="stock_id">gtk-undo</property> </object> <packing> <property name="expand">False</property> <property name="homogeneous">True</property> </packing> </child> <child> <object class="GtkToolButton" id="fullscreen_button"> <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_action_appearance">False</property> <property name="is_important">True</property> <property name="action_name">win.fullscreen</property> <property name="label" translatable="yes">Fullscreen</property> <property name="use_underline">True</property> <property name="stock_id">gtk-fullscreen</property> </object> <packing> <property name="expand">False</property> <property name="homogeneous">True</property> </packing> </child> <child> <object class="GtkToolButton" id="leave_fullscreen_button"> <property name="use_action_appearance">False</property> <property name="can_focus">False</property> <property name="use_action_appearance">False</property> <property name="is_important">True</property> <property name="action_name">win.fullscreen</property> <property name="label" translatable="yes">Leave Fullscreen</property> <property name="use_underline">True</property> <property name="stock_id">gtk-leave-fullscreen</property> </object> <packing> <property name="expand">False</property> <property name="homogeneous">True</property> </packing> </child> </object> </interface>

# Ο χρησιμοποιούμενος κώδικας για παραγωγή αυτού παραδείγματος

Τώρα δημιουργούμε τον παρακάτω κώδικα, που προσθέτει την εργαλειοθήκη από το αρχείο που μόλις δημιουργήσαμε.

from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Gio import sys

class MyWindow(Gtk.ApplicationWindow):

def __init__(self, app): Gtk.Window.__init__(self, title="Toolbar Example", application=app) self.set_default_size(400, 200)

# a grid to attach the toolbar (see below) grid = Gtk.Grid() self.add(grid) # we have to show the grid (and therefore the toolbar) with show(), # as show_all() would show also the buttons in the toolbar that we want to # be hidden (such as the leave_fullscreen button) grid.show()

# a builder to add the UI designed with Glade to the grid: builder = Gtk.Builder() # get the file (if it is there) try: builder.add_from_file("toolbar_builder.ui") except: print("file not found") sys.exit() # and attach it to the grid grid.attach(builder.get_object("toolbar"), 0, 0, 1, 1)

# two buttons that will be used later in a method self.fullscreen_button = builder.get_object("fullscreen_button") self.leave_fullscreen_button = builder.get_object( "leave_fullscreen_button")

# create the actions that control the window, connect their signal to a # callback method (see below), add the action to the window:

# undo undo_action = Gio.SimpleAction.new("undo", None) undo_action.connect("activate", self.undo_callback) self.add_action(undo_action)

# and fullscreen fullscreen_action = Gio.SimpleAction.new("fullscreen", None) fullscreen_action.connect("activate", self.fullscreen_callback) self.add_action(fullscreen_action)

# callback for undo def undo_callback(self, action, parameter): print("You clicked \"Undo\".")

# callback for fullscreen def fullscreen_callback(self, action, parameter): # check if the state is the same as Gdk.WindowState.FULLSCREEN, which # is a bit flag is_fullscreen = self.get_window().get_state( ) & Gdk.WindowState.FULLSCREEN != 0 if is_fullscreen: self.unfullscreen() self.leave_fullscreen_button.hide() self.fullscreen_button.show() else: self.fullscreen() self.fullscreen_button.hide() self.leave_fullscreen_button.show()

class MyApplication(Gtk.Application):

def __init__(self): Gtk.Application.__init__(self)

def do_activate(self): win = MyWindow(self) # show the window - with show() not show_all() because that would show also # the leave_fullscreen button win.show()

def do_startup(self): Gtk.Application.do_startup(self)

# actions that control the application: create, connect their signal to a # callback method (see below), add the action to the application

# new new_action = Gio.SimpleAction.new("new", None) new_action.connect("activate", self.new_callback) app.add_action(new_action)

# open open_action = Gio.SimpleAction.new("open", None) open_action.connect("activate", self.open_callback) app.add_action(open_action)

# callback for new def new_callback(self, action, parameter): print("You clicked \"New\".")

# callback for open def open_callback(self, action, parameter): print("You clicked \"Open\".")

app = MyApplication() exit_status = app.run(sys.argv) sys.exit(exit_status)

# Χρήσιμες μέθοδοι για Gtk.Builder

Για τις χρήσιμες μεθόδους για ένα γραφικό στοιχείο εργαλειοθήκης, δείτε

Το Gtk.Builder κατασκευάζει μια διεπαφή από έναν ορισμό UI XML.

Η `add_from_file(filename)` φορτώνει και αναλύει το δεδομένο αρχείο και το συγχωνεύει με τα τρέχοντα περιεχόμενα του Gtk.Builder.

Η `add_from_file(string)` φορτώνει την δεδομένη συμβολοσειρά και το συγχωνεύει με τα τρέχοντα περιεχόμενα του Gtk.Builder.

Η `add_objects_from_file(filename, object_ids)` είναι η ίδια με `add_from_file()`, αλλά φορτώνει μόνο τα αντικείμενα με τις ταυτότητες που δίνονται στη λίστα `object_id`.

Το `add_objects_from_string(string, object_ids)` είναι ίδιο με το `add_from_string()`, αλλά φορτώνει μόνο τα αντικείμενα με τα αναγνωριστικά που δόθηκαν στη λίστα `object_id`s.

Η `get_object(object_id)` ανακτά το γραφικό στοιχείο με την ταυτότητα `object_id` από τα φορτωμένα αντικείμενα του δομητή.

Η `get_objects()` επιστρέφει όλα τα φορτωμένα αντικείμενα.

Το `connect_signals(handler_object)` συνδέει τα σήματα στις μεθόδους που δίνονται στον `handler_object`. Αυτό μπορεί να είναι οποιοδήποτε αντικείμενο περιέχει κλειδιά ή γνωρίσματα που καλούνται όπως τα ονόματα χειριστή σήματος που δίνονται στην περιγραφή διεπαφής, π.χ. μια κλάση ή ένα λεξικό. Στη γραμμή 39 το σήμα `"activate"` από την ενέργεια `undo_action` συνδέεται σε μια συνάρτηση επανάκλησης `undo_callback()` χρησιμοποιώντας `action.connect(signal, callback function)`. Δείτε για μια πιο λεπτομερή εξήγηση.

# Αναφορές API

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

GtkGrid

GtkBuilder

GtkWidget

Δομή γεγονότων