Blame platform-demos/es/model-view-controller.py.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:e="http://projectmallard.org/experimental/" type="guide" style="task" id="model-view-controller.py" xml:lang="es">
Packit 1470ea
Packit 1470ea
<info>
Packit 1470ea
    <title type="text">El diseño modelo/vista/controlador (Python)</title>
Packit 1470ea
  <link type="guide" xref="beginner.py#theory"/>
Packit 1470ea
  <link type="next" xref="combobox_multicolumn.py"/>
Packit 1470ea
  <revision version="0.1" date="2012-06-30" status="stub"/>
Packit 1470ea
Packit 1470ea
  <desc>El diseño modelo/vista/controlador</desc>
Packit 1470ea
  <credit type="author copyright">
Packit 1470ea
    <name>Sebastian Pölsterl</name>
Packit 1470ea
    <email its:translate="no">sebp@k-d-w.org</email>
Packit 1470ea
    <years>2011</years>
Packit 1470ea
  </credit>
Packit 1470ea
  <credit type="author copyright editor">
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
    <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>El diseño modelo/vista/controlador</title>
Packit 1470ea
Packit 1470ea
<links type="section"/>
Packit 1470ea
Packit 1470ea
<section id="overview">
Packit 1470ea
<title>Visión general</title>
Packit 1470ea
Packit 1470ea

Tanto los widgets <link xref="treeview_simple_liststore.py">TreeView</link> como los <link xref="combobox.py">ComboBox</link> se construyen sobre el diseño modelo/vista/controlador. El modelo (una implementación de Gtk.TreeModel, generalmente Gtk.TreeStore o Gtk.ListStore) almacena los datos; la vista (por ejemplo, Gtk.TreeView, Gtk.ComboBox, o Gtk.ComboBoxText) recibe las notificaciones de cambio y muestra el contenido del modelo. El controlador, finalmente, cambia el estado del modelo (a través de algunos métodos en la implementación del modelo, como append() o remove()) y le notifica a la vista de estos cambios (a través de señales como «changed»).

Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="model">
Packit 1470ea
<title>El modelo</title>
Packit 1470ea
Packit 1470ea

La principal diferencia entre las dos implementaciones primarias de Gtk.TreeModel es que Gtk.ListStore contiene filas simples de datos sin hijos, mientras que Gtk.TreeStore también contiene filas de datos, pero cada fila puede tener filas hijas (que a su vez pueden tener filas hijas, y así sucesivamente).

Packit 1470ea
Packit 1470ea

Los datos en el modelo pueden obtenerse o modificarse usando el «iter» del árbol y el índice de columna, Gtk.TreeIter, o Gtk.TreePath.

Packit 1470ea
Packit 1470ea

Con el objeto de lista empotrado de Python puede usar len() para obtener el número de filas y usar fragmentos para obtener o establecer valores. De lo contrario, el método append() devuelve una instancia de Gtk.TreeIter, que apunta al lugar de la fila insertada recientemente. También puede obtener un Gtk.TreeIter llamando a get_iter().

Packit 1470ea
Packit 1470ea

Como Gtk.ListStore sólo contiene un nivel, es decir que los nodos no tienen nodos hijos, una ruta es esencialmente el índice de la fila a la que quiere acceder. En el caso de Gtk.TreeStore, una ruta es una lista de índices o una cadena. La forma de la cadena es una lista de números separados por «:». Cada número se refiere al desplazamiento en ese nivel. Entonces, la ruta «0» se refiere al nodo raíz y la ruta «2:4» al quinto hijo del tercer nodo.

Packit 1470ea
Packit 1470ea

Métodos útiles para un Gtk.TreeModel:

Packit 1470ea
<list>
Packit 1470ea
  <item>

get_iter(ruta) devuelve una instancia de Gtk.TreeIter que apunta a ruta. Se espera que sea una lista de números separados por «:», o una tupla. Por ejemplo, la cadena «10:4:0» equivale a la tupla (10, 4, 0), ya que las dos crearían una ruta de profundidad 3 apuntando al 11º hijo del nodo raíz, el 5º hijo de ese 11º hijo, y el 1er hijo de ese 5º hijo.

</item>
Packit 1470ea
  <item>

iter_next(treeiter) devuelve una instancia de Gtk.TreeIter apuntando siguiendo el «treeiter» en el nivel actual o None si no hay un «iter» siguiente.

</item>
Packit 1470ea
  <item>

iter_has_child(treeiter) devuelve True si treeiter tiene hijos, False de lo contrario.

</item>
Packit 1470ea
  <item>

iter_children(treeiter) devuelve una instancia de Gtk.TreeIter apuntando al primer hijo de treeiter o None si treeiter no tiene hijos.

</item>
Packit 1470ea
  <item>

get_iter_first() devuelve una instancia de Gtk.TreeIter apuntando al primer iterador en el árbol (el que está en la ruta «0») o None si el árbol está vacío.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea

Métodos útiles para un Gtk.ListStore:

Packit 1470ea
<list>
Packit 1470ea
  <item>

append(fila) añade una fila nueva a este «ListStore», donde fila puede ser una lista de valores para cada columna; row también puede omitirse o ser None, y en ese caso se añade una fila vacía. El método devuelve un Gtk.TreeIter apuntando a la fila añadida.

</item>
Packit 1470ea
  <item>

remove(iter) elimina iter del Gtk.ListStore, y devuelve True si el iter es válido, y False si no lo es. Después de eliminarse, iter se establece a la siguiente fila válida.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea

Métodos útiles para un Gtk.TreeStore:

Packit 1470ea
<list>
Packit 1470ea
  <item>

append(padre, fila) añade una fila nueva a este «TreeStore»; padre debe ser un «Gtk.TreeIter» válido. Si «padre» no es None, entonces añadirá la fila nueva después del último hijo de «padre», de lo contrario añadirá una fila al nivel superior; fila puede ser una lista de valores para cada columna; o puede omitirse o ser None; en este último caso se añadirá una fila vacía. El método devuelve un Gtk.TreeIter apuntando a la fila añadida.

</item>
Packit 1470ea
  <item>

remove(iter) elimina iter del Gtk.ListStore, y devuelve True si el iter es válido, y False si no lo es. Después de eliminarse, iter se establece a la siguiente fila válida.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="treeview">
Packit 1470ea
<title>La vista: el caso de «TreeView»</title>
Packit 1470ea
Packit 1470ea

Una vista de árbol muestra la estructura de elementos padres e hijos como un árbol. Consulte <link xref="treeview_treestore.py">este ejemplo</link>.

Packit 1470ea
Packit 1470ea

La Gtk.TreeViewColumn se usa para organizar las columnas verticales.

Packit 1470ea
Packit 1470ea

Métodos útiles para un Gtk.TreeView:

Packit 1470ea
<list>
Packit 1470ea
  <item>

set_model(modelo) establece el modelo para esta vista de árbol. Si ya tiene un modelo, lo eliminará antes de establecer el nuevo. Si el modelo es None, entonces quitará el modelo viejo.

</item>
Packit 1470ea
  <item>

get_model() devuelve el modelo en el que está basada esta vista de árbol, None si no tiene modelo.

</item>
Packit 1470ea
  <item>

append_column(columna) añade la columna a la lista de columnas.

</item>
Packit 1470ea
  <item>

get_selection() obtiene la Gtk.TreeSelection asociada a esta vista de árbol.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea

Métodos útiles para un Gtk.TreeViewColumn:

Packit 1470ea
<list>
Packit 1470ea
  <item>

add_attribute(renderizador, atributo, valor) añade un mapeo de atributo a esta columna. atributo es el parámetro en renderizador al que se le asigna el valor.

</item>
Packit 1470ea
  <item>

pack_start(renderizador, expandir) empaqueta el renderizador en el principio de esta columna. Si expandir es False, entonces no se le asigna a renderizador más espacio del que necesita. Cualquier espacio sin utilizar se divide equitativamente entre las celdas en las que «expandir» es True.

</item>
Packit 1470ea
  <item>

pack_end(renderizador, expandir) añade el renderizador al final de esta columna. Si expandir es False, entonces no se le asigna a renderizador más espacio del que necesita. Cualquier espacio sin utilizar se divide equitativamente entre celdas en las que expandir es True.

</item>
Packit 1470ea
  <item>

set_sort_column_id(id_columna_ordenada) establece la columna del modelo por la que debe ordenarse la vista. Esto también hace que se pueda pulsar la cabecera de la columna.

</item>
Packit 1470ea
  <item>

set_sort_indicator(opción) establece si se muestra una pequeña flecha en la cabecera de la columna; opción puede ser True (se muestra el indicador) o False.

</item>
Packit 1470ea
  <item>

set_sort_order(orden) cambia el orden por el que se ordena la columna; orden puede ser Gtk.SortType.ASCENDING o Gtk.SortType.DESCENDING.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="combobox">
Packit 1470ea
<title>La vista: el caso de la «ComboBox»</title>
Packit 1470ea
Packit 1470ea

Una Gtk.ComboBox permite la selección de un elemento desde un menú desplegable, consulte <link xref="combobox.py">este ejemplo</link>. Para una lista de opciones textuales, también se puede usar Gtk.ComboBoxText, que es más simple. Tanto Gtk.ComboBox como Gtk.ComboBoxText pueden contener una entrada.

Packit 1470ea
Packit 1470ea

Métodos útiles para un Gtk.ComboBox:

Packit 1470ea
<list>
Packit 1470ea
  <item>

El método estático new_with_entry() crea una Gtk.ComboBox nueva vacía con una entrada; el método estático new_with_model(modelo) crea una con el modelo inicializado a modelo nueva; y el método estático new_with_model_and_entry(modelo) es una combinación de los dos.

</item>
Packit 1470ea
  <item>

get_active_iter() devuelve un Gtk.TreeIter que apunta al elemento activo actual. Si no existe, devuelve None.

</item>
Packit 1470ea
  <item>

set_model(modelo) establece el modelo que esta caja combinada usa a modelo, y quita un modelo anterior (si existiera). Si modelo es None, entonces lo quitará. Tenga en cuenta que esta función no limpia los renderizadores de celda.

</item>
Packit 1470ea
  <item>

set_entry_text_column(columna_texto) establece la columna del modelo de la que esta caja combinada obtendrá las cadenas a columna_texto. La columna columna_texto en el modelo de esta caja combinada debe ser del tipo str (esto sólo es relevante si esta caja combinada se creó con la propiedad «has-entry» establecida a «True»).

</item>
Packit 1470ea
  <item>

set_wrap_width(anchura) establece la anchura del ajuste de línea de esta caja combinada a anchura. La anchura de ajuste de línea es básicamente el número preferido de columnas en el que quiere que el diálogo emergente se distribuya en una rejilla.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea

Métodos útiles para un Gtk.ComboBoxText:

Packit 1470ea
<list>
Packit 1470ea
  <item>

El método estático new_with_entry() crea una Gtk.ComboBoxText nueva vacía con una entrada.

</item>
Packit 1470ea
  <item>

append_text(texto) añade texto a la lista de cadenas almacenadas en esta caja combinada.

</item>
Packit 1470ea
  <item>

get_active_text() devuelve la cadena actualmente activa en esta caja combinada, o None si no hay ninguna seleccionada. Si esta caja combinada contiene una entrada, esta función devolverá su contenido (que no será necesariamente un elemento de la lista).

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="cellrenderer">
Packit 1470ea
<title>La vista: los «CellRenderer»</title>
Packit 1470ea
Packit 1470ea

La vista hace uso de Gtk.CellRenderer de varios tipos para dibujar los datos.

Packit 1470ea
Packit 1470ea

Implementaciones de Gtk.CellRenderer y métodos útiles:

Packit 1470ea
<list>
Packit 1470ea
  <item>

Gtk.CellRendererText: muestra texto en una celda

</item>
Packit 1470ea
  <item>

Gtk.CellRendererToggle: muestra un interruptor o botón de radio en una celda. Métodos útiles:

Packit 1470ea
    <list>
Packit 1470ea
    <item>

set_active(opción): activa o desactiva un renderizador de celda

</item>
Packit 1470ea
    <item>

get_active(): devuelve si el renderizador de celda está activado

</item>
Packit 1470ea
    <item>

set_radio(radio): si «radio» es True, el renderizador de celda muestra un interruptor de radio (es decir, un interruptor en un grupo mutuamente exclusivo); si es False, muestra una casilla de verificación (una opción booleana independiente)

</item>
Packit 1470ea
    <item>

get_radio(): devuelve si se están mostrando botones de radio en lugar de casillas de verificación.

</item>
Packit 1470ea
    </list>
Packit 1470ea
  </item>
Packit 1470ea
  <item>

Gtk.CellRendererPixbuf: muestra una imagen en una celda

</item>
Packit 1470ea
  <item>

Gtk.CellRendererCombo: muestra texto en una celda; pero mientras que Gtk.CellRendererText ofrece una entrada simple para editar el texto, Gtk.CellRendererCombo ofrece un widget Gtk.ComboBox para editarlo. Puede usarse con o sin un widget «Gtk.Entry» asociado, dependiendo del valor de la propiedad «has-entry».

</item>
Packit 1470ea
  <item>

Gtk.CellRendererProgress: muestra un valor numérico en forma de barra de progreso en una celda; puede mostrar un texto sobre ella

</item>
Packit 1470ea
  <item>

Gtk.CellRendererSpinner: muestra una animación giratoria en una celda

</item>
Packit 1470ea
  <item>

Gtk.CellRendererSpin: muestra un botón incremental en una celda

</item>
Packit 1470ea
  <item>

Gtk.CellRendererAccel: muestra un acelerador de teclado en una celda

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="selection">
Packit 1470ea
<title>El controlador: la selección</title>
Packit 1470ea
Packit 1470ea

La mayoría de las aplicaciones no solo necesitarán mostrar datos, sino también recibir eventos de entrada de los usuarios. Para hacer esto, simplemente obtenga una referencia a un objeto de selección y conéctela a la señal «changed».

Packit 1470ea
Packit 1470ea
Packit 1470ea
select = tree.get_selection()
Packit 1470ea
select.connect("changed", on_tree_selection_changed)
Packit 1470ea
Packit 1470ea
Packit 1470ea

Después, para obtener datos de la fila seleccionada:

Packit 1470ea
Packit 1470ea
Packit 1470ea
def on_tree_selection_changed(selection):
Packit 1470ea
    model, treeiter = selection.get_selected()
Packit 1470ea
    if treeiter != None:
Packit 1470ea
        print "You selected", model[treeiter][0]
Packit 1470ea
Packit 1470ea
Packit 1470ea

Métodos útiles para un Gtk.TreeSelection:

Packit 1470ea
Packit 1470ea
<list>
Packit 1470ea
  <item>

set_mode(tipo) establece el tipo de la selección, donde «tipo» puede ser

Packit 1470ea
  <list>
Packit 1470ea
    <item>

Gtk.SelectionMode.NONE: la selección no es posible

</item>
Packit 1470ea
    <item>

Gtk.SelectionMode.SINGLE: se puede seleccionar uno o ningún elemento

</item>
Packit 1470ea
    <item>

Gtk.SelectionMode.BROWSE: se selecciona exactamente un elemento. En algunas circunstancias, como inicialmente o durante una operación de búsqueda, es posible que ningún elemento esté seleccionado. Lo que realmente se prohíbe es que el usuario deseleccione un elemento actualmente seleccionado excepto si selecciona otro.

</item>
Packit 1470ea
    <item>

Gtk.SelectionMode.MULTIPLE: se puede seleccionar cualquier número de elementos. Las pulsaciones cambien el estado de un elemento. Se puede usar la tecla «Ctrl» para agrandar la selección, y «Mayús» para seleccionar entre el foco y el hijo al que apunta. Algunos widgets también pueden permitir arrastrar y soltar para seleccionar un rango de elementos.

</item>
Packit 1470ea
  </list>
Packit 1470ea
  </item>
Packit 1470ea
  <item>

get_selected() devuelve una tupla (modelo, treeiter), donde modelo es el modelo actual y treeiter un Gtk.TreeIter que apunta a la fila actualmente seleccionada, o «None» si no la hay. El método no funciona si el modo de selección es Gtk.SelectionMode.MULTIPLE; en ese caso, use get_selected_rows() en su lugar, que devuelve una lista de instancias Gtk.TreePath de todas las filas seleccionadas.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="references">
Packit 1470ea
<title>Referencias</title>
Packit 1470ea
Packit 1470ea
<list>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkTreeModel.html">GtkTreeModel</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkTreeView.html">GtkTreeView</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkTreeViewColumn.html">GtkTreeViewColumn</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkComboBox.html">GtkComboBox</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkCellRenderer.html">GtkCellRenderer</link>

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
</page>