10.12. Fichas

El control NoteBook (Fichas) es una colección de "páginas" que se solapan unas con otras; cada página contiene información diferente y sólo una es visible al mismo tiempo. Este control se ha hecho muy popular últimamente en la programación de interfaces gráficas de usuario, y es una buena manera de mostrar bloques de información similar que guardan una separación en la pantalla.

La primera función que necesitas saber, como probablemente adivines, se usa para crear un nuevo control de fichas.

  notebook = gtk.Notebook()

Una vez que has creado las fichas, hay unos cuantos métodos que manipulan el control de fichas. Veámoslos individualmente.

El primero que trataremos especifica cómo colocar los indicadores de página. Estos indicadores o "pestañas" como se les conoce, se pueden colocar de cuatro maneras: arriba, abajo, izquierda o derecha.

  notebook.set_tab_pos(pos)

pos será uno de las siguientes, que son bastante descriptivas:

  POS_LEFT    # izquierda
  POS_RIGHT   # derecha
  POS_TOP     # arriba
  POS_BOTTOM  # abajo

POS_TOP es el valor predeterminado.

Lo siguiente que trataremos será cómo añadir páginas a las fichas. Hay tres formas de añadir páginas a un NoteBook. Veamos las dos primeras ya que son bastante similares.

  notebook.append_page(child, tab_label)

  notebook.prepend_page(child, tab_label)

Estos métodos añaden páginas a las fichas insertándolas al final (append), o al principio (prepend). child es el control que se colocará dentro de la página en cuestión, y tab_label es el título para la página que se está añadiendo. El control child debe crearse por separado, y normalmente es un conjunto de opciones de configuración dentro de otro control contenedor, como una tabla.

El último método para añadir una página a las fichas contiene todas las propiedades de los otros dos, y además te permite especificar en qué posición se insertará la página en las fichas.

  notebook.insert_page(child, tab_label, position)

Los parámetros son los mismos que en append() y prepend() excepto en que contiene un parámetro extra, position. Este parámetro se usa para especificar en qué lugar la página se insertará; la primera página está en la posición cero.

Ahora que sabemos cómo añadir una página, veamos cómo podemos borrar una página de las fichas.

  notebook.remove_page(page_num)

Este método borra la página especificada por page_num de las fichas contenidas en la variable notebook.

Para saber cuál es la página actual de las fichas utiliza el método:

  page = notebook.get_current_page()

Los próximos dos métodos son simples llamadas para mover la página hacia alante o hacia atrás. Simplemente utilizalos en el control de fichas sobre el que quieras operar.

Nota

Cuando el notebook tiene como página actual la última página, y se llama a next_page() , no ocurre nada. De forma análoga, si el notebook está en la primera página, y se llama a prev_page() , no pasa nada.

  notebook.next_page()

  notebook.prev_page()

Este método fija la página "activa". Si quieres que las fichas comiencen con la página 5 activa, usarás este método. Si no lo usas, el valor predeterminado de las fichas es mostrar la primera página.

  notebook.set_current_page(page_num)

Los siguientes dos métodos añaden o borran las pestañas y el borde respectivamente.

  notebook.set_show_tabs(show_tabs)

  notebook.set_show_border(show_border)

El siguiente método es útil cuando tienes un gran número de páginas, y las pestañas no caben en la página. Te permite desplazar las pestañas usando dos botones de flechas.

  notebook.set_scrollable(scrollable)

show_tabs (mostrar pestañas), show_border (mostrar border) y scrollable (desplazable) pueden ser TRUE o FALSE.

Ahora veamos un ejemplo, está ampliado a partir del código testgtk.py que viene con la distribución PyGTK. El programa notebook.py crea una ventana con unas fichas y seis botones. Las fichas contienen 11 páginas, añadidas de tres formas diferentes, al principio, en medio o al final. Los botones te permiten rotar la posición de las pestañas, añadir o borrar las pestañas y el borde, borrar una página, cambiar las páginas hacia delante y hacia atrás, y salir del programa. La figura Figura 10.9. Ejemplo de Fichas muestra la ventana del programa:

Figura 10.9. Ejemplo de Fichas

Ejemplo de Fichas

El código fuente de notebook.py es:

    1   #!/usr/bin/env python
    2   
    3   # example notebook.py
    4   
    5   import gtk
    6   
    7   class NotebookExample:
    8	    # This method rotates the position of the tabs
    9	    def rotate_book(self, button, notebook):
   10	        notebook.set_tab_pos((notebook.get_tab_pos()+1) %4)
   11	
   12	    # Add/Remove the page tabs and the borders
   13	    def tabsborder_book(self, button, notebook):
   14	        tval = gtk.FALSE
   15	        bval = gtk.FALSE
   16	        if self.show_tabs == gtk.FALSE:
   17		    tval = gtk.TRUE 
   18	        if self.show_border == gtk.FALSE:
   19		    bval = gtk.TRUE
   20	
   21	        notebook.set_show_tabs(tval)
   22	        self.show_tabs = tval
   23	        notebook.set_show_border(bval)
   24	        self.show_border = bval
   25	
   26	    # Remove a page from the notebook
   27	    def remove_book(self, button, notebook):
   28	        page = notebook.get_current_page()
   29	        notebook.remove_page(page)
   30	        # Need to refresh the widget -- 
   31	        # This forces the widget to redraw itself.
   32	        notebook.draw((0,0,-1,-1))
   33	
   34	    def delete(self, widget, event=None):
   35	        gtk.mainquit()
   36	        return gtk.FALSE
   37	
   38	    def __init__(self):
   39	        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   40	        window.connect("delete_event", self.delete)
   41	        window.set_border_width(10)
   42	
   43	        table = gtk.Table(3,6,gtk.FALSE)
   44	        window.add(table)
   45	
   46	        # Create a new notebook, place the position of the tabs
   47	        notebook = gtk.Notebook()
   48	        notebook.set_tab_pos(gtk.POS_TOP)
   49	        table.attach(notebook, 0,6,0,1)
   50	        notebook.show()
   51	        self.show_tabs = gtk.TRUE
   52	        self.show_border = gtk.TRUE
   53	
   54	        # Let's append a bunch of pages to the notebook
   55	        for i in range(5):
   56	            bufferf = "Append Frame %d" % (i+1)
   57	            bufferl = "Page %d" % (i+1)
   58	
   59	            frame = gtk.Frame(bufferf)
   60	            frame.set_border_width(10)
   61	            frame.set_size_request(100, 75)
   62	            frame.show()
   63	
   64	            label = gtk.Label(bufferf)
   65	            frame.add(label)
   66	            label.show()
   67	
   68	            label = gtk.Label(bufferl)
   69	            notebook.append_page(frame, label)
   70	      
   71	        # Now let's add a page to a specific spot
   72	        checkbutton = gtk.CheckButton("Check me please!")
   73	        checkbutton.set_size_request(100, 75)
   74	        checkbutton.show ()
   75	
   76	        label = gtk.Label("Add page")
   77	        notebook.insert_page(checkbutton, label, 2)
   78	
   79	        # Now finally let's prepend pages to the notebook
   80	        for i in range(5):
   81	            bufferf = "Prepend Frame %d" % (i+1)
   82	            bufferl = "PPage %d" % (i+1)
   83	
   84	            frame = gtk.Frame(bufferf)
   85	            frame.set_border_width(10)
   86	            frame.set_size_request(100, 75)
   87	            frame.show()
   88	
   89	            label = gtk.Label(bufferf)
   90	            frame.add(label)
   91	            label.show()
   92	
   93	            label = gtk.Label(bufferl)
   94	            notebook.prepend_page(frame, label)
   95	    
   96	        # Set what page to start at (page 4)
   97	        notebook.set_current_page(3)
   98	
   99	        # Create a bunch of buttons
  100	        button = gtk.Button("close")
  101	        button.connect("clicked", self.delete)
  102	        table.attach(button, 0,1,1,2)
  103	        button.show()
  104	
  105	        button = gtk.Button("next page")
  106	        button.connect("clicked", lambda w: notebook.next_page())
  107	        table.attach(button, 1,2,1,2)
  108	        button.show()
  109	
  110	        button = gtk.Button("prev page")
  111	        button.connect("clicked", lambda w: notebook.prev_page())
  112	        table.attach(button, 2,3,1,2)
  113	        button.show()
  114	
  115	        button = gtk.Button("tab position")
  116	        button.connect("clicked", self.rotate_book, notebook)
  117	        table.attach(button, 3,4,1,2)
  118	        button.show()
  119	
  120	        button = gtk.Button("tabs/border on/off")
  121	        button.connect("clicked", self.tabsborder_book, notebook)
  122	        table.attach(button, 4,5,1,2)
  123	        button.show()
  124	
  125	        button = gtk.Button("remove page")
  126	        button.connect("clicked", self.remove_book, notebook)
  127	        table.attach(button, 5,6,1,2)
  128	        button.show()
  129	
  130	        table.show()
  131	        window.show()
  132	
  133	def main():
  134	    gtk.main()
  135	    return 0
  136	
  137	if __name__ == "__main__":
  138	    NotebookExample()
  139	    main()
  

Espero que esto te ayude en tu camino para crear fichas en tus programas PyGTK.