# Nástrojová lišta vytvořená pomocí 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
Lišta s tlačítky a dalšími widgety

# Toolbar (vytvořený pomocí Glade)

Tento příklad je podobný příkladu s tím rozdílem, že k vytvoření nástrojové lišty v souboru .ui ve formátu XML použijeme návrhář Glade.

# Vytvoření nástrojové lišty pomocí Glade

Když chcete vytvořit nástrojovou lištu pomocí návrháře rozhraní Glade:

Otevřete Glade a uložte soubor jako toolbar_builder.ui.

Snímek obrazovky s uživatelským rozhraním Glade

V Kontejnerech na levé straně klikněte pravým tlačítkem na ikonu nástrojové lišty a vyberte Přidat widget do nejvyšší úrovně.

Snímek obrazovky s ikonou nástrojové lišty v uživatelském rozhraní Glade

Na kartě Obecné vpravo dole změňte Název na toolbar a Zobrazovat šipku na Ne.

Snímek obrazovky s kartou Obecné

Na kartě Běžné nastavte Roztáhnout vodorovně na Ano.

Snímek obrazovky s kartou Běžné

Klikněte pravým tlačítkem na „toolbar“ vpravo nahoře a vyberte Upravit. Objeví se okno Editor nástrojové lišty.

Snímek obrazovky, na kterém je kliknuto pravým tlačítkem kvůli úpravě nástrojové lišty

Chceme přidat 5 tlačítek ToolButton: „New“, „Open“, „Undo“, „Fullscreen“ a „Leave Fullscreen“. Nejprve přidáme ToolButton „New“.

Na kartě Hierarchie klikněte na Přidat.

Změňte název „toolbutton1“ na „new_button“.

Posuňte se dolů a nastavte Je důležitá na Ano. To způsobí, že když je zobrazena nástrojová lišta, bude nástrojovém tlačítku zobrazen popisek.

Zadejte Název akce: app.new.

Změňte Popisek na New.

V rozbalovacím seznamu zvolte New jako Standadní ID nebo napište gtk-new.

Opakujte předchozí kroky pro zbývající tlačítka ToolButton s následujícími vlastnostmi:

Name | Je důležitá | Název akce | Label | Standardní ID
--- | --- | --- | --- | ---
open_button | Ano | app.open | Open | gtk-open
undo_button | Ano | win.undo | Undo | gtk-undo
fullscreen_button | Ano | win.fullscreen | Fullscreen | gtk-fullscreen
leave_fullscreen_button | Ano | win.fullscreen | Leave Fullscreen | gtk-leave-fullscreen

Zavřete Editor panelu nástrojů.

Když svůj program spustíte, nechcete aby bylo zobrazené nástrojové tlačítko Leave Fullscreen, protože aplikace není v režimu celé obrazovky. Můžete to nastavit na kartě Běžné, kde přepnete vlastnost Viditelný na Ne. Nástrojové tlačítko sice bude pořád viditelné v návrháři rozhraní, ale po načtení do vašeho programu se bude chovat podle očekávání. Upozorňujeme, že jakékoliv použití metody `show_all()` by toto nastavení přepsalo, takže v celém kódu musíme používat `show()` zvlášť pro každý prvek.

Nastavení vlastnosti Viditelná na Ne

Uložte svoji práci a zavřete Glade.

Soubor XML vytvořený v Glade je zobrazen níže. Jedná se o popis nástrojové lišty. V době, kdy bylo toto psáno, neexistovala v uživatelském rozhraní Glade volba pro přidání třídy `Gtk.STYLE_CLASS_PRIMARY_TOOLBAR`. Můžeme ji ale do souboru XML přidat ručně. Udělá se to přidáním následujícího kódu XML na řádek 9 v toolbar_builder.ui:

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

Pokud tuto část nepřidáte, bude program i tak fungovat dobře. Akorát výsledná nástrojová lišty bude vypadat lehce odlišně než ta na snímku obrazovky na začátku této stránky.

<?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>

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

Nyní vytvoříme kód zobrazený níže, který přidá nástrojovou lištu ze souboru, který jsme právě vytvořili.

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)

# Mřížka pro připojení nástrojové lišty (viz dále) grid = Gtk.Grid() self.add(grid) # Musí zobrazit mřížku (a tím nástrojovou lištu) pomocí show(), # protože show_all() by zobrazilo a tlačítka na liště, která ale # chceme skrytá (kvůli tlačítku leave_fullscreen) grid.show()

# Builder pro přidání návrhu uživatelského rozhraní navrženého # v Glade do mřížky: builder = Gtk.Builder() # Získá soubor (pokud existuje) try: builder.add_from_file("toolbar_builder.ui") except: print("file not found") sys.exit() # A připojí jej do mřížky grid.attach(builder.get_object("toolbar"), 0, 0, 1, 1)

# Dvě tlačítka, která budo použita později v metodě self.fullscreen_button = builder.get_object("fullscreen_button") self.leave_fullscreen_button = builder.get_object( "leave_fullscreen_button")

# Vytvoří akce, které ovládají okno, napojí jejich signály na metodu # zpětného volání (viz dále), přidá akce do okna:

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

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

# Zpětné volání pro "undo" def undo_callback(self, action, parameter): print("You clicked \"Undo\".")

# Zpětné volání pro "fullscreen" def fullscreen_callback(self, action, parameter): # Zkontroluje, jestli je stav stejný jako Gdk.WindowState.FULLSCREEN, # což je bitový příznak 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) # Zobrazí okno pomocí show(), ne show_all(), protože to by zobrazilo # také tlačítko leave_fullscreen win.show()

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

# Akce, které ovládají aplikace: vytvoří je, napojí jejich signály na # metody zpětného volání (viz dále), přidá akce do aplikace

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

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

# Zpětné volání pro "new" def new_callback(self, action, parameter): print("You clicked \"New\".")

# Zpětné volání pro "open" def open_callback(self, action, parameter): print("You clicked \"Open\".")

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

# Užitečné metody pro Gtk.Builder

Na užitečné metody pro widget Toolbar se podívejte do kapitoly

Gtk.Builder sestaví uživatelské rozhraní z definice ve formátu XML.

`add_from_file(název_souboru)` načte a zpracuje zadaný soubor a sloučí jej s aktuálním obsahem v Gtk.Builder.

`add_from_string(řetězec)` zpracuje zadaný řetězec a sloučí jej s aktuálním obsahem v Gtk.Builder.

`add_objects_from_file(název_souboru, id_objektů)` je stejná jako `add_from_file()`, akorát že načte jen objekty, jejichž ID je uvedeno v seznamu `id_objektů`.

`add_objects_from_string(řetězec, id_objektů)` je stejná jako `add_from_string()`, akorát že načte jen objekty, jejichž ID je uvedeno v seznamu `id_objektů`.

`get_object(id_objektu)` získá widget s ID `id_objektu` ze seznamu načtených objektů v Gtk.Builder.

`get_objects()` vrátí všechny načtené objekty.

`connect_signals(obsluhující_objekt)` napojí signál na metodu zadanou v `obsluhující_objekt`. Může se jednat o libovolný objekt obsahující klíče a atributy, které jsou volány podobně jako název obsluhy signálu zadaný v popisu rozhraní, např. třída nebo slovník. Na řádku 39 je signál `"activate"` z akce `undo_action` napojen na funkci zpětného volání `undo_callback()` pomocí `action.connect(signal, callback function)`. Podrobnější vysvětlení viz .

# Odkazy k API

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

GtkGrid

GtkBuilder

GtkWidget

Struktury událostí