terça-feira, 21 de abril de 2015

4.3. Programa Exemplo Packaging


 

Aqui é o código usado para criar a imagem acima. Ele está bem comentado, por isso não vai ser difícil de seguir. Recomenda-se a sua aplicação e depois jogar com ele.
    1 #!/usr/bin/env python
    2 
    3 # ejemplo packbox.py
    4 
    5 import pygtk
    6 pygtk.require('2.0')
    7 import gtk
    8 import sys, string
    9 
   10 # Función auxiliar que crea una nueva HBox llena de botones con etiqueta. Los argumentos
   11 # de las variables en las que tenemos interés se pasan a esta función. No mostramos la
   12 # caja pero sí todo lo que contiene.
   13 
   14 def make_box(homogeneous, spacing, expand, fill, padding):
   15 
   16     # Creamos una nueva HBox con los parámetros homogeneous
   17     # y spacing adecuados.
   18     box = gtk.HBox(homogeneous, spacing)
   19 
   20     # Creamos una serie de botones con los parámetros adecuados
   21     button = gtk.Button("box.pack")
   22     box.pack_start(button, expand, fill, padding)
   23     button.show()
   24 
   25     button = gtk.Button("(button,")
   26     box.pack_start(button, expand, fill, padding)
   27     button.show()
   28 
   29     # Creamos un botón con una etiqueta que depende del valor de
   30     # expand.
   31     if expand == gtk.TRUE:
   32         button = gtk.Button("TRUE,")
   33     else:
   34         button = gtk.Button("FALSE,")
   35 
   36     box.pack_start(button, expand, fill, padding)
   37     button.show()
   38 
   39     # Aquí hacemos lo mismo que en la creación del botón de "expand"
   40     # anterior, pero usa la forma abreviada.
   41     button = gtk.Button(("FALSE,", "TRUE,")[fill==gtk.TRUE])
   42     box.pack_start(button, expand, fill, padding)
   43     button.show()
   44 
   45     padstr = "%d)" % padding
   46 
   47     button = gtk.Button(padstr)
   48     box.pack_start(button, expand, fill, padding)
   49     button.show()
   50     return box
   51 
   52 class PackBox1:
   53     def delete_event(self, widget, event, data=None):
   54         gtk.main_quit()
   55         return gtk.FALSE
   56 
   57     def __init__(self, which):
   58 
   59         # Creamos nuestra ventana
   60         self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   61 
   62         # Siempre debemos recordar la conexión de la señal delete_event
   63         # a la ventana principal. Esto es muy importante de cara a un comportamiento
   64         # intuitivo adecuado
   65         self.window.connect("delete_event", self.delete_event)
   66         self.window.set_border_width(10)
   67     
   68         # Creamos una caja vertical (vbox) en la que empaquetar las cajas horizontales.
   69         # Esto nos permite apilar las cajas horizontales llenas de botones
   70         # una encima de otra en esta vbox.
   71         box1 = gtk.VBox(gtk.FALSE, 0)
   72     
   73         # qué ejemplo mostramos. Éstos se corresponden a las imágenes anteriores.
   74         if which == 1:
   75             # creamos una etiqueta nueva.
   76             label = gtk.Label("HBox(FALSE, 0)")
   77  
   78             # Alineamos la etiqueta al lado izquierdo. Comentaremos este y otros
   79             # métodos en la sección sobre Atributos de los Controles.
   80             label.set_alignment(0, 0)
   81 
   82             # Empaquetamos la etiqueta en la caja vertical (vbox box1).  Recuérdese que
   83             # los controles que se añaden a una caja vertical se apilan uno encima del otro
   84             # en orden.
   85             box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0)
   86  
   87             # Mostramos la etiqueta
   88             label.show()
   89  
   90             # Llamamos a nuestra función de crear caja - homogeneous = FALSE, spacing = 0,
   91             # expand = FALSE, fill = FALSE, padding = 0
   92             box2 = make_box(gtk.FALSE, 0, gtk.FALSE, gtk.FALSE, 0)
   93             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
   94             box2.show()
   95 
   96             # Llamamos a nuestra función de crear caja - homogeneous = FALSE, spacing = 0,
   97             # expand = TRUE, fill = FALSE, padding = 0
   98             box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.FALSE, 0)
   99             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  100             box2.show()
  101  
  102             # Los argumentos son: homogeneous, spacing, expand, fill, padding
  103             box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.TRUE, 0)
  104             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  105             box2.show()
  106  
  107             # Crea un separador, que veremos qué hacen más adelante,
  108             # aunque son muy simples.
  109             separator = gtk.HSeparator()
  110  
  111             # Empaquetamos el separador en la vbox. Recuérdese que empaquetamos todos estos
  112             # controles en una vbox, por lo que se apilarán
  113             # verticalmente.
  114             box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)
  115             separator.show()
  116  
  117             # Creamos otra etiqueta y la mostramos.
  118             label = gtk.Label("HBox(TRUE, 0)")
  119             label.set_alignment(0, 0)
  120             box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0)
  121             label.show()
  122  
  123             # Los argumentos son: homogeneous, spacing, expand, fill, padding
  124             box2 = make_box(gtk.TRUE, 0, gtk.TRUE, gtk.FALSE, 0)
  125             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  126             box2.show()
  127  
  128             # Los argumentos son: homogeneous, spacing, expand, fill, padding
  129             box2 = make_box(gtk.TRUE, 0, gtk.TRUE, gtk.TRUE, 0)
  130             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  131             box2.show()
  132  
  133             # Otro separador.
  134             separator = gtk.HSeparator()
  135             # Los últimos 3 argumentos de pack_start son:
  136             # expand, fill, padding.
  137             box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)
  138             separator.show()
  139         elif which == 2:
  140             # Creamos una etiqueta nueva, recordando que box1 es una vbox creada
  141             # cerca del comienzo de __init__()
  142             label = gtk.Label("HBox(FALSE, 10)")
  143             label.set_alignment( 0, 0)
  144             box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0)
  145             label.show()
  146  
  147             # Los argumentos son: homogeneous, spacing, expand, fill, padding
  148             box2 = make_box(gtk.FALSE, 10, gtk.TRUE, gtk.FALSE, 0)
  149             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  150             box2.show()
  151  
  152             # Los argumentos son: homogeneous, spacing, expand, fill, padding
  153             box2 = make_box(gtk.FALSE, 10, gtk.TRUE, gtk.TRUE, 0)
  154             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  155             box2.show()
  156  
  157             separator = gtk.HSeparator()
  158             # Los últimos 3 argumentos de pack_start son:
  159             # expand, fill, padding.
  160             box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)
  161             separator.show()
  162  
  163             label = gtk.Label("HBox(FALSE, 0)")
  164             label.set_alignment(0, 0)
  165             box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0)
  166             label.show()
  167  
  168             # Los argumentos son: homogeneous, spacing, expand, fill, padding
  169             box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.FALSE, 10)
  170             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  171             box2.show()
  172  
  173             # Los argumentos son: homogeneous, spacing, expand, fill, padding
  174             box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.TRUE, 10)
  175             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  176             box2.show()
  177  
  178             separator = gtk.HSeparator()
  179             # Los últimos 3 argumentos de pack_start son:
  180             # expand, fill, padding.
  181             box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)
  182             separator.show()
  183 
  184         elif which == 3:
  185 
  186             # Esto ilustra la posibilidad de usar pack_end() para
  187             # alinear los controles a la derecha. Primero creamos una caja nueva, como antes.
  188             box2 = make_box(gtk.FALSE, 0, gtk.FALSE, gtk.FALSE, 0)
  189 
  190             # Creamos la etiqueta que pondremos al final.
  191             label = gtk.Label("end")
  192             # La empaquetamos con pack_end(), por lo que se pone en el extremo derecho
  193             # de la hbox creada en la llamada a make_box().
  194             box2.pack_end(label, gtk.FALSE, gtk.FALSE, 0)
  195             # Mostramos la etiqueta.
  196             label.show()
  197  
  198             # Empaquetamos la box2 en box1
  199             box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  200             box2.show()
  201  
  202             # Un separador para la parte de abajo.
  203             separator = gtk.HSeparator()
  204             
  205             # Esto establece explícitamente el ancho del separador a 400 píxeles y 5
  206             # píxeles de alto. Así la hbox que creamos también tendría 400
  207             # píxeles de ancho, y la etiqueta "end" estará separada de las otras
  208             # de la hbox. En otro caso, todos los controles de la
  209             # hbox estarían empaquetados lo más juntos posible.
  210             separator.set_size_request(400, 5)
  211             # empaquetamos el separador en la vbox (box1) creada cerca del principio
  212             # de __init__()
  213             box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5)
  214             separator.show()
  215     
  216         # Creamos otra hbox nueva. ¡Recordemos que podríamos usar cuantas queramos!
  217         quitbox = gtk.HBox(gtk.FALSE, 0)
  218     
  219         # Nuestro botón de salida.
  220         button = gtk.Button("Quit")
  221     
  222         # Configuramos la señal que finalice el programa al pulsar el botón
  223         button.connect("clicked", lambda w: gtk.main_quit())
  224         # Empaquetamos el botón en la quitbox.
  225         # Los 3 últimos argumentos de pack_start son:
  226         # expand, fill, padding.
  227         quitbox.pack_start(button, gtk.TRUE, gtk.FALSE, 0)
  228         # empaquetamos la quitbox en la vbox (box1)
  229         box1.pack_start(quitbox, gtk.FALSE, gtk.FALSE, 0)
  230     
  231         # Empaquetamos la vbox (box1), que ahora contiene todos los controles,
  232         # en la ventana principal.
  233         self.window.add(box1)
  234     
  235         # Y mostramos todo lo que queda
  236         button.show()
  237         quitbox.show()
  238     
  239         box1.show()
  240         # Mostrando la ventana al final de forma que todo aparezca de una vez.
  241         self.window.show()
  242 
  243 def main():
  244     # y, naturalmente, el bucle de eventos principal.
  245     gtk.main()
  246     # El control se devuelve a este punto cuando se llama a main_quit().
  247     return 0         
  248 
  249 if __name__ =="__main__":
  250     if len(sys.argv) != 2:
  251         sys.stderr.write("usage: packbox.py num, where num is 1, 2, or 3.\n")
  252         sys.exit(1)
  253     PackBox1(string.atoi(sys.argv[1]))
  254     main()
 
A pequena turnê pelo código packbox.py começa por 14-50 linhas que definem uma função auxiliar make_box que cria uma caixa horizontal e preenche-lo com botões de acordo com os parâmetros especificados. Retorna uma referência para a caixa horizontal.
Linhas 52-241 definem o método de inicialização de __init__ () Classe PackBox1 que cria uma uma caixa vertical que é cheio com um conjunto de controlo que dependem do argumento que recebe e janela. Se você perder a 1, linhas 75-138 criar uma janela mostrando as cinco possibilidades únicas que resultam da variação dos parâmetros homogêneos, expandir e preencher. Se você perder a 2, as linhas 140-182 criar uma janela muesstra diferentes combinações de preenchimento com espaçamento e estofamento. Finalmente, se você perder a 3, as linhas 188-214 criar uma janela que mostra o uso do método pack_start () para justificar os botões do lado esquerdo e do método pack_end () para justificar uma etiqueta para a direita. Linhas 215-235 criar uma caixa horizontal que contém um botão que é embalado em caixa vertical. O 'clicado' sinal do botão está ligado à função PyGTK gtk.main_quit () para encerrar o programa.
Linhas 250-252 verificar os argumentos da linha de comando e terminar o programa utilizando a função sys.exit () se há exatamente um argumento. Linha 251 cria uma instância de PackBox1. Linha 253 chama a função gtk.main () para iniciar o processamento de eventos GTK + laço.
Neste programa exemplo, as referências aos controles (exceto a janela) não são armazenados na instância do objeto atributos porque eles são necessários mais tarde.

Nenhum comentário:

Postar um comentário