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