|
Packit |
1470ea |
|
|
Packit |
1470ea |
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="guide" style="task" id="menubar.py" xml:lang="cs">
|
|
Packit |
1470ea |
<info>
|
|
Packit |
1470ea |
<title type="text">MenuBar (Python)</title>
|
|
Packit |
1470ea |
<link type="guide" xref="beginner.py#menu-combo-toolbar"/>
|
|
Packit |
1470ea |
<link type="seealso" xref="gmenu.py"/>
|
|
Packit |
1470ea |
<link type="next" xref="colorbutton.py"/>
|
|
Packit |
1470ea |
<revision version="0.1" date="2012-08-01" status="stub"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<credit type="author copyright">
|
|
Packit |
1470ea |
<name>Tiffany Antopolski</name>
|
|
Packit |
1470ea |
<email its:translate="no">tiffany.antopolski@gmail.com</email>
|
|
Packit |
1470ea |
<years>2012</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
<credit type="author copyright">
|
|
Packit |
1470ea |
<name>Marta Maria Casetti</name>
|
|
Packit |
1470ea |
<email its:translate="no">mmcasetti@gmail.com</email>
|
|
Packit |
1470ea |
<years>2012</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<desc>Widget, který sdružuje widgety GtkMenuItem.</desc>
|
|
Packit |
1470ea |
</info>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<title>MenuBar vytvořený pomocí XML a GtkBuilder</title>
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/menubar.png"/>
|
|
Packit |
1470ea |
MenuBar vytvořený pomocí XML a GtkBuilder.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<links type="section"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="xml"> <title>Vytvoření MenuBar pomocí XML</title>
|
|
Packit |
1470ea |
Abyste vytvořili nabídkovou lištu pomocí XML:
|
|
Packit |
1470ea |
<steps>
|
|
Packit |
1470ea |
<item>Pomocí svého oblíbeného textového editoru vytvořte <file>menubar.ui</file>. </item>
|
|
Packit |
1470ea |
<item>Na začátek souboru vložte následující řádek:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<?xml version="1.0"? encoding="UTF-8"?>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>Chceme vytvořit rozhraní, které bude obsahovat naši nabídkovou lištu a její podnabídky. Naše nabídková lišta bude obsahovat podnabídky <gui>Soubor</gui>, <gui>Upravit</gui>, <gui>Volby</gui> a <gui>Nápověda</gui>. Do souboru přidáme následující kód XML:
|
|
Packit |
1470ea |
<?xml version="1.0" encoding="UTF-8"?>
|
|
Packit |
1470ea |
<interface>
|
|
Packit |
1470ea |
<menu id="menubar">
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">File</attribute>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Edit</attribute>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Choices</attribute>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Help</attribute>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
</menu>
|
|
Packit |
1470ea |
</interface>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>Nyní vytvoříme soubor .py a použijeme GtkBuilder k naimportování souboru <file>menubar.ui</file>, který jsme před chvílí vytvořili. </item>
|
|
Packit |
1470ea |
</steps>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="basis"> <title>Přidání MenuBar do okna pomocí GtkBuilder</title>
|
|
Packit |
1470ea |
from gi.repository import Gtk
|
|
Packit |
1470ea |
import sys
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
class MyWindow(Gtk.ApplicationWindow):
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def __init__(self, app):
|
|
Packit |
1470ea |
Gtk.Window.__init__(self, title="MenuBar Example", application=app)
|
|
Packit |
1470ea |
self.set_default_size(200, 200)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
class MyApplication(Gtk.Application):
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def __init__(self):
|
|
Packit |
1470ea |
Gtk.Application.__init__(self)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def do_activate(self):
|
|
Packit |
1470ea |
win = MyWindow(self)
|
|
Packit |
1470ea |
win.show_all()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def do_startup(self):
|
|
Packit |
1470ea |
Gtk.Application.do_startup(self)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Builder pro přidání uživatelského rozhraní navrženého v Glade do mřížky
|
|
Packit |
1470ea |
builder = Gtk.Builder()
|
|
Packit |
1470ea |
# Získá soubor (pokud existuje)
|
|
Packit |
1470ea |
try:
|
|
Packit |
1470ea |
builder.add_from_file("menubar_basis.ui")
|
|
Packit |
1470ea |
except:
|
|
Packit |
1470ea |
print("file not found")
|
|
Packit |
1470ea |
sys.exit()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Použije metodu Gtk.Application.set_menubar(nabídková_lišta) pro přídání
|
|
Packit |
1470ea |
# nabídkové lišty do aplikace (Upozornění: NE do okna!)
|
|
Packit |
1470ea |
self.set_menubar(builder.get_object("menubar"))
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
app = MyApplication()
|
|
Packit |
1470ea |
exit_status = app.run(sys.argv)
|
|
Packit |
1470ea |
sys.exit(exit_status)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Nyní aplikaci napsanou v jazyce Python spusťte. Měla by vypadat podobně, jako na obrázku na začátku této stránky.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="xml2"> <title>Přidání položek do nabídky</title>
|
|
Packit |
1470ea |
Začneme přidáním dvou položek nabídky do nabídky <gui>File</gui>: <gui>New</gui> a <gui>Quit</gui>. Provedeme to přidáním oddílu s těmito položkami do podnabídky File . Soubor <file>menubar.ui</file> by měl vypadat jako tento (řádky 6 až 13 včetně obsahují nově přidaný oddíl):
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<listing>
|
|
Packit |
1470ea |
<title>menubar.ui</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<?xml version="1.0" encoding="UTF-8"?>
|
|
Packit |
1470ea |
<interface>
|
|
Packit |
1470ea |
<menu id="menubar">
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">File</attribute>
|
|
Packit |
1470ea |
<section>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">New</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name ="label">Quit</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Edit</attribute>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Choices</attribute>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Help</attribute>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
</menu>
|
|
Packit |
1470ea |
</interface>
|
|
Packit |
1470ea |
</listing>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Podle tohoto vzoru nyní můžete přidat položky <gui>Copy</gui> a <gui>Paste</gui> do podnabídky <gui>Edit</gui> a položku <gui>About</gui> do podnabídky <gui>Help</gui>.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="actions">
|
|
Packit |
1470ea |
<title>Nastavení akcí</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Nyní vytvoříme akce pro „New“ a „Quit“ napojené na funkce zpětného volání v souboru .py. Například „new“ vytvoříme jako:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
new_action = Gio.SimpleAction.new("new", None)
|
|
Packit |
1470ea |
new_action.connect("activate", self.new_callback)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
A vytvoříme funkci zpětného volání pro „new“ jako
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def new_callback(self, action, parameter):
|
|
Packit |
1470ea |
print "You clicked \"New\""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Nyní v souboru XML napojíme položky nabídky na akce v souboru XML přidáním atributu „action“:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">New</attribute>
|
|
Packit |
1470ea |
<attribute name="action">app.new</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Všimněte si, že pro akce, které se vztahují k aplikaci, používáme předponu app. a pro akce, které se vztahují k oknu, používáme předponu win. .
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Nakonec v souboru <file>.py</file> přidáme akci do aplikace nebo do okna – například app.new bude přidáno do aplikace v metodě do_startup(self) jako
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
self.add_action(new_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Podrobnější vysvětlení signálů a zpětných volání viz <link xref="signals-callbacks.py"/>.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="win-app"><title>Akce: Aplikace nebo okno?</title>
|
|
Packit |
1470ea |
Výše jsme vytvořili akce "new" a "open" jako součást třídy MyApplication . Akce, které ovládají přímo aplikaci, jako je "quit" by se vytvořily podobně.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Některé akce, jako je "copy" (kopírovat) nebo "paste" (vložit) se vztahují k oknu a ne k aplikaci. Akce okna by měly být vytvářeny jako součást třídy okna.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Soubor s celým příkladem obsahuje jak akce aplikace, tak akce okna. Akce okna jsou obvykle zároveň i součástí <link xref="gmenu.py">aplikační nabídky</link>. Není dobrým zvykem vkládat akce okna do aplikační nabídky. Pro předváděcí účely zahrnuje soubor s celým příkladem, který následuje, kód XML v souboru <file>.ui</file>, který vytvoří aplikační nabídku včetně položek "New" a "Open" a ty jsou zavěšeny na stejnou akci, jako položky nabídkové lišty se stejným názvem.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="choices">
|
|
Packit |
1470ea |
<title>Podnabídka „Choices“ a položky se stavem</title>
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/menubar_choices.png"/>
|
|
Packit |
1470ea |
Řádky 30 až 80 včetně v <link xref="menubar.py#xml-code"/> ukazují kód XML použitý k vytvoření uživatelského rozhraní pro nabídku <gui>Choices</gui>.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Dosud vytvořené akce jsou bezstavové, tj. takové, které si nepamatují stave nebo nezávisí na stavu akce samotné. Akce, které potřebujeme vytvořit pro podnabídku <gui>Choices</gui> jsou na druhou stranu stavové. Příkladem vytvoření stavové akce je:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
shape_action = Gio.SimpleAction.new_stateful("shape", GLib.VariantType.new('s'), GLib.Variant.new_string('line'))
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
kde proměnné v metodě jsou: název, typ parametru (v tomto případě řetězec, úplný seznam s významem znaků viz <link href="http://developer.gnome.org/glib/unstable/glib-GVariantType.html">zde</link>), počáteční stav (v tomto případě 'line' , v případě pravdivostní hodnoty True by to mělo být Glib.Variant.new_boolean(True) apod.; úplný seznam viz <link href="http://developer.gnome.org/glib/unstable/glib-GVariant.html">zde</link>).
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Po vytvoření stavové jednoduché akce ji napojíme na funkci zpětného volání a přidáme ji do okna (nebo do aplikace v některých případech), stejně jako dřív:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
shape_action.connect("activate", self.shape_callback)
|
|
Packit |
1470ea |
self.add_action(shape_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="xml-code">
|
|
Packit |
1470ea |
<title>Celý soubor s uživatelským rozhraním ve formátu XML pro tento příklad</title>
|
|
Packit |
1470ea |
<?xml version="1.0" encoding="UTF-8"?>
|
|
Packit |
1470ea |
<interface>
|
|
Packit |
1470ea |
<menu id="menubar">
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">File</attribute>
|
|
Packit |
1470ea |
<section>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">New</attribute>
|
|
Packit |
1470ea |
<attribute name="action">app.new</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Quit</attribute>
|
|
Packit |
1470ea |
<attribute name="action">app.quit</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Edit</attribute>
|
|
Packit |
1470ea |
<section>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Copy</attribute>
|
|
Packit |
1470ea |
<attribute name="action">win.copy</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Paste</attribute>
|
|
Packit |
1470ea |
<attribute name="action">win.paste</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Choices</attribute>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Shapes</attribute>
|
|
Packit |
1470ea |
<section>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Line</attribute>
|
|
Packit |
1470ea |
<attribute name="action">win.shape</attribute>
|
|
Packit |
1470ea |
<attribute name="target">line</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Triangle</attribute>
|
|
Packit |
1470ea |
<attribute name="action">win.shape</attribute>
|
|
Packit |
1470ea |
<attribute name="target">triangle</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Square</attribute>
|
|
Packit |
1470ea |
<attribute name="action">win.shape</attribute>
|
|
Packit |
1470ea |
<attribute name="target">square</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Polygon</attribute>
|
|
Packit |
1470ea |
<attribute name="action">win.shape</attribute>
|
|
Packit |
1470ea |
<attribute name="target">polygon</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Circle</attribute>
|
|
Packit |
1470ea |
<attribute name="action">win.shape</attribute>
|
|
Packit |
1470ea |
<attribute name="target">circle</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<section>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">On</attribute>
|
|
Packit |
1470ea |
<attribute name="action">app.state</attribute>
|
|
Packit |
1470ea |
<attribute name="target">on</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Off</attribute>
|
|
Packit |
1470ea |
<attribute name="action">app.state</attribute>
|
|
Packit |
1470ea |
<attribute name="target">off</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
<section>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Awesome</attribute>
|
|
Packit |
1470ea |
<attribute name="action">app.awesome</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
<submenu>
|
|
Packit |
1470ea |
<attribute name="label">Help</attribute>
|
|
Packit |
1470ea |
<section>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">About</attribute>
|
|
Packit |
1470ea |
<attribute name="action">win.about</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</submenu>
|
|
Packit |
1470ea |
</menu>
|
|
Packit |
1470ea |
<menu id="appmenu">
|
|
Packit |
1470ea |
<section>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">New</attribute>
|
|
Packit |
1470ea |
<attribute name="action">app.new</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">Quit</attribute>
|
|
Packit |
1470ea |
<attribute name="action">app.quit</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</menu>
|
|
Packit |
1470ea |
</interface>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="python-code">
|
|
Packit |
1470ea |
<title>Kompletní soubor v jazyce Python pro tento příklad</title>
|
|
Packit |
1470ea |
from gi.repository import Gtk
|
|
Packit |
1470ea |
from gi.repository import GLib
|
|
Packit |
1470ea |
from gi.repository import Gio
|
|
Packit |
1470ea |
import sys
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
class MyWindow(Gtk.ApplicationWindow):
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def __init__(self, app):
|
|
Packit |
1470ea |
Gtk.Window.__init__(self, title="MenuBar Example", application=app)
|
|
Packit |
1470ea |
self.set_default_size(200, 200)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Vytvoří bezstavovou akci (název, typ parametru)
|
|
Packit |
1470ea |
copy_action = Gio.SimpleAction.new("copy", None)
|
|
Packit |
1470ea |
# Napojí ji na funkci zpětného volání
|
|
Packit |
1470ea |
copy_action.connect("activate", self.copy_callback)
|
|
Packit |
1470ea |
# Přidá ji do okna
|
|
Packit |
1470ea |
self.add_action(copy_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Vytvoří bezstavovou akci (název, typ parametru)
|
|
Packit |
1470ea |
paste_action = Gio.SimpleAction.new("paste", None)
|
|
Packit |
1470ea |
# Napojí ji na funkci zpětného volání
|
|
Packit |
1470ea |
paste_action.connect("activate", self.paste_callback)
|
|
Packit |
1470ea |
# Přidá ji do okna
|
|
Packit |
1470ea |
self.add_action(paste_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Vytvoří stavovou akci (název, typ_parametru, počáteční_stav)
|
|
Packit |
1470ea |
shape_action = Gio.SimpleAction.new_stateful(
|
|
Packit |
1470ea |
"shape", GLib.VariantType.new('s'), GLib.Variant.new_string('line'))
|
|
Packit |
1470ea |
# Napojí ji na funkci zpětného volání
|
|
Packit |
1470ea |
shape_action.connect("activate", self.shape_callback)
|
|
Packit |
1470ea |
# Přidá ji do okna
|
|
Packit |
1470ea |
self.add_action(shape_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Vytvoří stavovou akci
|
|
Packit |
1470ea |
about_action = Gio.SimpleAction.new("about", None)
|
|
Packit |
1470ea |
# Napojí ji na funkci zpětného volání
|
|
Packit |
1470ea |
about_action.connect("activate", self.about_callback)
|
|
Packit |
1470ea |
# Přidá ji do aplikace
|
|
Packit |
1470ea |
self.add_action(about_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Funkce zpětného volání pro copy_action
|
|
Packit |
1470ea |
def copy_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("\"Copy\" activated")
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Funkce zpětného volání pro paste_action
|
|
Packit |
1470ea |
def paste_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("\"Paste\" activated")
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Funkce zpětného volání pro shape_action
|
|
Packit |
1470ea |
def shape_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("Shape is set to", parameter.get_string())
|
|
Packit |
1470ea |
# Note that we set the state of the action!
|
|
Packit |
1470ea |
action.set_state(parameter)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Funkce zpětného volání pro about (viz příklad AboutDialog)
|
|
Packit |
1470ea |
def about_callback(self, action, parameter):
|
|
Packit |
1470ea |
# Gtk.AboutDialog
|
|
Packit |
1470ea |
aboutdialog = Gtk.AboutDialog()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Seznam autorů kódu a dokumentace (bude použit později)
|
|
Packit |
1470ea |
authors = ["GNOME Documentation Team"]
|
|
Packit |
1470ea |
documenters = ["GNOME Documentation Team"]
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Vyplní AboutDialog
|
|
Packit |
1470ea |
aboutdialog.set_program_name("MenuBar Example")
|
|
Packit |
1470ea |
aboutdialog.set_copyright(
|
|
Packit |
1470ea |
"Copyright \xc2\xa9 2012 GNOME Documentation Team")
|
|
Packit |
1470ea |
aboutdialog.set_authors(authors)
|
|
Packit |
1470ea |
aboutdialog.set_documenters(documenters)
|
|
Packit |
1470ea |
aboutdialog.set_website("http://developer.gnome.org")
|
|
Packit |
1470ea |
aboutdialog.set_website_label("GNOME Developer Website")
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Napojí signál "response" na on_close, aby se zavřel
|
|
Packit |
1470ea |
# AboutDialog, když je kliknuto na "close"
|
|
Packit |
1470ea |
aboutdialog.connect("response", self.on_close)
|
|
Packit |
1470ea |
# Zobrazí AboutDialog
|
|
Packit |
1470ea |
aboutdialog.show()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Funkce zpětného volání pro likvidaci AboutDialog
|
|
Packit |
1470ea |
def on_close(self, action, parameter):
|
|
Packit |
1470ea |
action.destroy()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
class MyApplication(Gtk.Application):
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def __init__(self):
|
|
Packit |
1470ea |
Gtk.Application.__init__(self)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def do_activate(self):
|
|
Packit |
1470ea |
win = MyWindow(self)
|
|
Packit |
1470ea |
win.show_all()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def do_startup(self):
|
|
Packit |
1470ea |
# PRVNÍ, CO SE MUSÍ UDĚLAT: do_startup()
|
|
Packit |
1470ea |
Gtk.Application.do_startup(self)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Vytvoří bezstavovou akci
|
|
Packit |
1470ea |
new_action = Gio.SimpleAction.new("new", None)
|
|
Packit |
1470ea |
# Napojí ji na funkci zpětného volání
|
|
Packit |
1470ea |
new_action.connect("activate", self.new_callback)
|
|
Packit |
1470ea |
# Přidá ji do aplikace
|
|
Packit |
1470ea |
self.add_action(new_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Vytvoří bezstavovou akci
|
|
Packit |
1470ea |
quit_action = Gio.SimpleAction.new("quit", None)
|
|
Packit |
1470ea |
# Napojí ji na funkci zpětného volání
|
|
Packit |
1470ea |
quit_action.connect("activate", self.quit_callback)
|
|
Packit |
1470ea |
# Přidá ji do aplikace
|
|
Packit |
1470ea |
self.add_action(quit_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Vytvoří stavovou akci
|
|
Packit |
1470ea |
state_action = Gio.SimpleAction.new_stateful(
|
|
Packit |
1470ea |
"state", GLib.VariantType.new('s'), GLib.Variant.new_string('off'))
|
|
Packit |
1470ea |
# Napojí ji na funkci zpětného volání
|
|
Packit |
1470ea |
state_action.connect("activate", self.state_callback)
|
|
Packit |
1470ea |
# Přidá ji do aplikace
|
|
Packit |
1470ea |
self.add_action(state_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Vytvoří stavovou akci
|
|
Packit |
1470ea |
awesome_action = Gio.SimpleAction.new_stateful(
|
|
Packit |
1470ea |
"awesome", None, GLib.Variant.new_boolean(False))
|
|
Packit |
1470ea |
# Napojí ji na funkci zpětného volání
|
|
Packit |
1470ea |
awesome_action.connect("activate", self.awesome_callback)
|
|
Packit |
1470ea |
# Přidá ji do aplikace
|
|
Packit |
1470ea |
self.add_action(awesome_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Builder, který přidá navrh uživatelského rozhraní z Glade do mřížky
|
|
Packit |
1470ea |
builder = Gtk.Builder()
|
|
Packit |
1470ea |
# Získá soubor (pokud existuje)
|
|
Packit |
1470ea |
try:
|
|
Packit |
1470ea |
builder.add_from_file("menubar.ui")
|
|
Packit |
1470ea |
except:
|
|
Packit |
1470ea |
print("file not found")
|
|
Packit |
1470ea |
sys.exit()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Použije metodu Gtk.Application.set_menubar(menubar) pro přidání
|
|
Packit |
1470ea |
# nabídkové lišty a aplikační nabídky (Poznámka: NE do okna!)
|
|
Packit |
1470ea |
self.set_menubar(builder.get_object("menubar"))
|
|
Packit |
1470ea |
self.set_app_menu(builder.get_object("appmenu"))
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Funkce zpětného volání pro new
|
|
Packit |
1470ea |
def new_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("You clicked \"New\"")
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Funkce zpětného volání pro quit
|
|
Packit |
1470ea |
def quit_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("You clicked \"Quit\"")
|
|
Packit |
1470ea |
sys.exit()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Funkce zpětného volání pro state
|
|
Packit |
1470ea |
def state_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("State is set to", parameter.get_string())
|
|
Packit |
1470ea |
action.set_state(parameter)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# Funkce zpětného volání pro awesome
|
|
Packit |
1470ea |
def awesome_callback(self, action, parameter):
|
|
Packit |
1470ea |
action.set_state(GLib.Variant.new_boolean(not action.get_state()))
|
|
Packit |
1470ea |
if action.get_state().get_boolean() is True:
|
|
Packit |
1470ea |
print("You checked \"Awesome\"")
|
|
Packit |
1470ea |
else:
|
|
Packit |
1470ea |
print("You unchecked \"Awesome\"")
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
app = MyApplication()
|
|
Packit |
1470ea |
exit_status = app.run(sys.argv)
|
|
Packit |
1470ea |
sys.exit(exit_status)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="mnemonics-and-accelerators"><title>Horké klávesy a klávesové zkratky</title>
|
|
Packit |
1470ea |
Popisky mohou obsahovat horké (mnemotechnické) klávesy. Mají podobu podtržených písmen v popiscích a používají se pro ovládání z klávesnice. Horké klávesy se vytváří umístěním podtržítka před příslušný znak. Například "_File" namísto "File" v atributu label v <file>menubar.ui</file>.
|
|
Packit |
1470ea |
Horké klávesy jsou vidět, když zmáčknete klávesu <key>Alt</key>. Zmáčknutím <keyseq><key>Alt</key> <key>F</key></keyseq> otevřete nabídku <gui>File</gui>.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Klávesové zkratky mohou být přidány přímo do definicí uživatelského rozhraní. Například je běžné, že aplikaci lze ukončit zmáčknutím <keyseq><key>Ctrl</key><key>Q</key></keyseq>, nebo že lze uložit soubor zmáčknutím <keyseq><key>Ctrl</key><key>S</key></keyseq>. Pro přidání klávesové zkratky do definice uživatelského rozhraní stačí akorát přidat do položky atribut "accel" .
|
|
Packit |
1470ea |
<attribute name="accel"><Primary>q</attribute> vytvoří sekvenci <keyseq><key>Ctrl</key><key>Q</key></keyseq> při přidávání položky Quit . „Primary“ má zde význam klávesy <key>Ctrl</key> na počítačích PC nebo klávesy <key>⌘</key> na počítačích Mac.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
<attribute name="label">_Quit</attribute>
|
|
Packit |
1470ea |
<attribute name="action">app.quit</attribute>
|
|
Packit |
1470ea |
<attribute name="accel"><Primary>q</attribute>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="translatable"><title>Přeložitelné řetězce</title>
|
|
Packit |
1470ea |
Protože aplikace GNOME jsou překládány do <link href="http://l10n.gnome.org/languages/">mnoha jazyků</link>, je důležité, aby řetězce ve vaší aplikaci byly přeložitelné. U popisku to zajistíte jednoduše nastavením translatable="yes" :
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<attribute name="label" translatable="yes">Quit</attribute>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
<section id="references">
|
|
Packit |
1470ea |
<title>Odkazy k API</title>
|
|
Packit |
1470ea |
V této ukázce se používá následující:
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item><link href="http://developer.gnome.org/gio/unstable/GSimpleAction.html">GSimpleAction</link> </item>
|
|
Packit |
1470ea |
<item><link href="http://developer.gnome.org/gtk3/unstable/GtkBuilder.html">GtkBuilder</link> </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</page>
|