Αυτό το παράδειγμα είναι παρόμοιο με , εκτός από τη χρήση Glade για δημιουργία της εργαλειοθήκης σε ένα αρχείο XML .ui.
Για δημιουργία της γραμμής εργαλείων χρησιμοποιώντας το σχεδιαστή διεπαφής Glade:
Άνοιγμα του Glade και αποθήκευση του αρχείου ως
Στο
Στην καρτέλα
Στην καρτέλα
Δεξί κλικ στη γραμμή εργαλείων στα πάνω δεξιά και επιλέξτε
Θέλουμε να προσθέσουμε 5 κουμπιά εργαλείων: νέο, άνοιγμα, αναίρεση, πλήρης οθόνη και εγκατάλειψη πλήρους οθόνης. Πρώτα, θα προσθέσουμε το νέο ToolButton.
Στην καρτέλα
Αλλαγή του ονόματος του στοιχείου εργαλείου σε new_button.
Κύλιση προς τα κάτω και ρύθμιση του
Εισάγετε το
Αλλαγή του
Επιλογή του
Επανάληψη των παραπάνω βημάτων για τα υπολειπόμενα κουμπιά εργαλείων (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 του
<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 κατασκευάζει μια διεπαφή από έναν ορισμό 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)
. Δείτε για μια πιο λεπτομερή εξήγηση.
Σε αυτό το παράδειγμα χρησιμοποιήσαμε τα παρακάτω:
GtkGrid
GtkBuilder
GtkWidget
Δομή γεγονότων