|
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="es">
|
|
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>Un widget que contiene widgets «GtkMenuItem»</desc>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Daniel Mustieles</mal:name>
|
|
Packit |
1470ea |
<mal:email>daniel.mustieles@gmail.com</mal:email>
|
|
Packit |
1470ea |
<mal:years>2011 - 2017</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Nicolás Satragno</mal:name>
|
|
Packit |
1470ea |
<mal:email>nsatragno@gmail.com</mal:email>
|
|
Packit |
1470ea |
<mal:years>2012 - 2013</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Jorge González</mal:name>
|
|
Packit |
1470ea |
<mal:email>jorgegonz@svn.gnome.org</mal:email>
|
|
Packit |
1470ea |
<mal:years>2011</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
</info>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<title>Una barra de menú creada usando XML y GtkBuilder.</title>
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/menubar.png"/>
|
|
Packit |
1470ea |
Una barra de menú usando XML y GtkBuilder.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<links type="section"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="xml"> <title>Crear una barra de menú usando XML</title>
|
|
Packit |
1470ea |
Para crear la barra de menú usando XML:
|
|
Packit |
1470ea |
<steps>
|
|
Packit |
1470ea |
<item>Cree <file>menubar.ui</file> usando su editor de texto favorito. </item>
|
|
Packit |
1470ea |
<item>Añada la siguiente línea en la parte superior del archivo:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<?xml version="1.0"? encoding="UTF-8"?>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>Se quiere crear la interfaz que contendrá la barra de menú y sus submenús. Su barra de menú contendrá los submenús <gui>File</gui>, <gui>Edit</gui>, <gui>Choices</gui> y <gui>Help</gui>. Se le añade el siguiente código XML al archivo:
|
|
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>Ahora se crea el archivo .py y se usa «GtkBuilder» para importar el <file>menubar.ui</file> que acaba de crear. </item>
|
|
Packit |
1470ea |
</steps>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="basis"> <title>Añadir la barra de menú a la ventana usando «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 |
# a builder to add the UI designed with Glade to the grid:
|
|
Packit |
1470ea |
builder = Gtk.Builder()
|
|
Packit |
1470ea |
# get the file (if it is there)
|
|
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 |
# we use the method Gtk.Application.set_menubar(menubar) to add the menubar
|
|
Packit |
1470ea |
# to the application (Note: NOT the window!)
|
|
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 |
Ahora ejecute la aplicación de Python. Se debería ver como la imagen en la parte superior de esta página.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="xml2"> <title>Añadir elementos a los menús</title>
|
|
Packit |
1470ea |
Se empieza añadiendo 2 elementos al menú <gui>File</gui>: <gui>New</gui> y <gui>Quit</gui>. Esto se hace añadiéndole una section al submenú File con estos elementos. El <file>menubar.ui</file> debe verse así (líneas 6 a 13 inclusive conforman la sección nueva):
|
|
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 |
De esta misma manera puede añadirle un elemento Copy y uno Paste al submenú Edit , y un elemento About al submenú Help .
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="actions">
|
|
Packit |
1470ea |
<title>Configurar las acciones</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Ahora se crean las acciones para «New» y «Quit», conectadas a una función de retorno de llamada en el archivo de Python; por ejemplo se crea «new» así:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
new_action = Gio.SimpleAction.new("new", None)
|
|
Packit |
1470ea |
new_action.connect("activate", self.new_callback)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Y se crea la función de retorno de llamada de «new» como
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
def new_callback(self, action, parameter):
|
|
Packit |
1470ea |
print "You clicked \"New\""
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Ahora, en el archivo XML, se conectan los elementos del menú a las acciones en el archivo XML añadiendo el atributo «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 |
Tenga en cuenta que para una acción relativa a la aplicación, se usa el prefijo app. ; para acciones relativas a la ventana, se usa el prefijo win. .
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Finalmente, en el archivo de Python, se añade la acción a la aplicación o a la ventana: por ejemplo app.new se añadirá a la aplicación en el método do_startup(self) así:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
self.add_action(new_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Consulte la <link xref="signals-callbacks.py"/> para obtener una explicación más detallada sobre señales y retornos de llamada.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="win-app"><title>Acciones: ¿aplicación o ventana?</title>
|
|
Packit |
1470ea |
Anteriormente, se crearon las acciones «new» y «open» como parte de la clase «MyApplication». Las acciones que controlan la aplicación en sí, como «quit» deben crearse de manera similar.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Algunas acciones, como «copy» y «paste» trabajan con la ventana, no con la aplicación. Las acciones de ventanas deben crearse como parte de la clase de la ventana.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Los archivos de ejemplo completos contienen tanto acciones de aplicación como de ventana. Estas últimas son generalmente también las incluidas en el <link xref="gmenu.py">menú de la aplicación</link>. No es una buena práctica incluir acciones de ventana en el menú de la aplicación. Con motivo de demostración, los archivos de ejemplo completos incluyen XML en el archivo de IU que crea el menú de la aplicación incluyendo elementos «New» y «Open», y estos están vinculados a las mismas acciones que los elementos de la barra de menú del mismo nombre.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="choices">
|
|
Packit |
1470ea |
<title>Submenú «choices» y elementos con estado</title>
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/menubar_choices.png"/>
|
|
Packit |
1470ea |
Las líneas 30 a 80 inclusive del <link xref="menubar.py#xml-code"/> demuestran el código XML usado para crear la IU del menú <gui>Choices</gui>.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Las acciones creadas hasta ahora no tienen estado, esto significa que no mantienen o dependen de un estado dado por la acción en sí. Las acciones que necesita crear para el submenú «Choices», por otro lado, tienen estado. Un ejemplo de creación de una acción con estado es:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
shape_action = Gio.SimpleAction.new_stateful("shape", GLib.VariantType.new('s'), GLib.Variant.new_string('line'))
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
donde las variables del método son: nombre, tipo de parámetro (en este caso, una cadena: consulte <link href="http://developer.gnome.org/glib/unstable/glib-GVariantType.html">aquí</link> para una lista completa de significados de caracteres), estado inicial (en este caso, «line»; en el caso de un valor booleano True debería ser Glib.Variant.new_boolean(True) , y así sucesivamente, consulte <link href="http://developer.gnome.org/glib/unstable/glib-GVariant.html">aquí</link> para ver una lista completa).
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Después de haber creado la «SimpleAction» con estado se conecta a su función de retorno de llamada y se añade a la ventana (o la aplicación, si es el caso), como antes:
|
|
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>Archivo de IU XML completo de este ejemplo</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>Archivo de Python completo de este ejemplo</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 |
# action without a state created (name, parameter type)
|
|
Packit |
1470ea |
copy_action = Gio.SimpleAction.new("copy", None)
|
|
Packit |
1470ea |
# connected with the callback function
|
|
Packit |
1470ea |
copy_action.connect("activate", self.copy_callback)
|
|
Packit |
1470ea |
# added to the window
|
|
Packit |
1470ea |
self.add_action(copy_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# action without a state created (name, parameter type)
|
|
Packit |
1470ea |
paste_action = Gio.SimpleAction.new("paste", None)
|
|
Packit |
1470ea |
# connected with the callback function
|
|
Packit |
1470ea |
paste_action.connect("activate", self.paste_callback)
|
|
Packit |
1470ea |
# added to the window
|
|
Packit |
1470ea |
self.add_action(paste_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# action with a state created (name, parameter type, initial state)
|
|
Packit |
1470ea |
shape_action = Gio.SimpleAction.new_stateful(
|
|
Packit |
1470ea |
"shape", GLib.VariantType.new('s'), GLib.Variant.new_string('line'))
|
|
Packit |
1470ea |
# connected to the callback function
|
|
Packit |
1470ea |
shape_action.connect("activate", self.shape_callback)
|
|
Packit |
1470ea |
# added to the window
|
|
Packit |
1470ea |
self.add_action(shape_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# action with a state created
|
|
Packit |
1470ea |
about_action = Gio.SimpleAction.new("about", None)
|
|
Packit |
1470ea |
# action connected to the callback function
|
|
Packit |
1470ea |
about_action.connect("activate", self.about_callback)
|
|
Packit |
1470ea |
# action added to the application
|
|
Packit |
1470ea |
self.add_action(about_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# callback function for copy_action
|
|
Packit |
1470ea |
def copy_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("\"Copy\" activated")
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# callback function for paste_action
|
|
Packit |
1470ea |
def paste_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("\"Paste\" activated")
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# callback function for 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 |
# callback function for about (see the AboutDialog example)
|
|
Packit |
1470ea |
def about_callback(self, action, parameter):
|
|
Packit |
1470ea |
# a Gtk.AboutDialog
|
|
Packit |
1470ea |
aboutdialog = Gtk.AboutDialog()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# lists of authors and documenters (will be used later)
|
|
Packit |
1470ea |
authors = ["GNOME Documentation Team"]
|
|
Packit |
1470ea |
documenters = ["GNOME Documentation Team"]
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# we fill in the 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 |
# to close the aboutdialog when "close" is clicked we connect the
|
|
Packit |
1470ea |
# "response" signal to on_close
|
|
Packit |
1470ea |
aboutdialog.connect("response", self.on_close)
|
|
Packit |
1470ea |
# show the aboutdialog
|
|
Packit |
1470ea |
aboutdialog.show()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# a callback function to destroy the 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 |
# FIRST THING TO DO: do_startup()
|
|
Packit |
1470ea |
Gtk.Application.do_startup(self)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# action without a state created
|
|
Packit |
1470ea |
new_action = Gio.SimpleAction.new("new", None)
|
|
Packit |
1470ea |
# action connected to the callback function
|
|
Packit |
1470ea |
new_action.connect("activate", self.new_callback)
|
|
Packit |
1470ea |
# action added to the application
|
|
Packit |
1470ea |
self.add_action(new_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# action without a state created
|
|
Packit |
1470ea |
quit_action = Gio.SimpleAction.new("quit", None)
|
|
Packit |
1470ea |
# action connected to the callback function
|
|
Packit |
1470ea |
quit_action.connect("activate", self.quit_callback)
|
|
Packit |
1470ea |
# action added to the application
|
|
Packit |
1470ea |
self.add_action(quit_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# action with a state created
|
|
Packit |
1470ea |
state_action = Gio.SimpleAction.new_stateful(
|
|
Packit |
1470ea |
"state", GLib.VariantType.new('s'), GLib.Variant.new_string('off'))
|
|
Packit |
1470ea |
# action connected to the callback function
|
|
Packit |
1470ea |
state_action.connect("activate", self.state_callback)
|
|
Packit |
1470ea |
# action added to the application
|
|
Packit |
1470ea |
self.add_action(state_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# action with a state created
|
|
Packit |
1470ea |
awesome_action = Gio.SimpleAction.new_stateful(
|
|
Packit |
1470ea |
"awesome", None, GLib.Variant.new_boolean(False))
|
|
Packit |
1470ea |
# action connected to the callback function
|
|
Packit |
1470ea |
awesome_action.connect("activate", self.awesome_callback)
|
|
Packit |
1470ea |
# action added to the application
|
|
Packit |
1470ea |
self.add_action(awesome_action)
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# a builder to add the UI designed with Glade to the grid:
|
|
Packit |
1470ea |
builder = Gtk.Builder()
|
|
Packit |
1470ea |
# get the file (if it is there)
|
|
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 |
# we use the method Gtk.Application.set_menubar(menubar) to add the menubar
|
|
Packit |
1470ea |
# and the menu to the application (Note: NOT the window!)
|
|
Packit |
1470ea |
self.set_menubar(builder.get_object("menubar"))
|
|
Packit |
1470ea |
self.set_app_menu(builder.get_object("appmenu"))
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# callback function for new
|
|
Packit |
1470ea |
def new_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("You clicked \"New\"")
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# callback function for quit
|
|
Packit |
1470ea |
def quit_callback(self, action, parameter):
|
|
Packit |
1470ea |
print("You clicked \"Quit\"")
|
|
Packit |
1470ea |
sys.exit()
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
# callback function for 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 |
# callback function for 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>Atajos y aceleradores</title>
|
|
Packit |
1470ea |
Las etiquetas pueden contener atajos. Los atajos son caracteres subrayados en la etiqueta, usados para navegar con el teclado. Se crean poniendo un guión bajo antes del carácter de atajo. Por ejemplo «_Archivo» en lugar de solo «Archivo» en el atributo «label» del «menubar.ui».
|
|
Packit |
1470ea |
Los atajos son visibles cuando pulsa la tecla <key>Alt</key>. Presionar <keyseq><key>Alt</key><key>A</key></keyseq> abrirá el menú <gui>Archivo</gui>.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Los aceleradores pueden añadirse explícitamente en las definiciones de la IU. Por ejemplo, es común poder cerrar una aplicación presionando <keyseq><key>Ctrl</key><key>Q</key></keyseq> o guardar un archivo presionando <keyseq><key>Ctrl</key><key>S</key></keyseq>. Para añadir un acelerador a la definición de IU, simplemente añádale un atributo «accel» al elemento.
|
|
Packit |
1470ea |
<attribute name="accel"><Primary>q</attribute> creará la secuencia <keyseq><key>Ctrl</key><key>Q</key></keyseq> cuando se añada al elemento de la etiqueta Quit . Aquí, «Primary» se refiere a la tecla <key>Ctrl</key> en una PC o <key>⌘</key> en una 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>Cadenas traducibles</title>
|
|
Packit |
1470ea |
Dado que las aplicaciones de GNOME se traducen a <link href="http://l10n.gnome.org/languages/">muchos idiomas</link>, es importante que las cadenas en su aplicación puedan traducirse. Para hacer una etiqueta traducible, simplemente añada 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>Referencias de la API</title>
|
|
Packit |
1470ea |
En este ejemplo se usa lo siguiente:
|
|
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>
|