2011-05-25 15 views
10

Estoy intentando usar la funcionalidad del módulo Tkinter (Python 2.7) para crear una GUI que tenga ocho widgets colocados en una cuadrícula de 7 filas por 5 (lo siento que no incluí una imagen; el cuadro de diálogo no me permite navegar y cargar la imagen guardada).Python - Múltiples fotogramas con Grid manager

(Widget, START_ROW, start_col, row_span, column_span):

  1. ("Botón 0", 6, 0, 1, 1)
  2. ("Botón 1", 6, 1, 1 , 1)
  3. ("Botón 2", 6, 2, 1, 1)
  4. ("Botón 3", 6, 3, 1, 1)
  5. ("Botón 4", 6, 4, 1, 1)
  6. ("Marco1", 0, 0, 3, 2)
  7. ("Frame2", 2, 0, 3, 2)
  8. ("Frame3", 0, 3, 6, 3)

Sin embargo, cuando ejecuto mi código, los botones y Frame3 sean impuestos bien, pero Frame1 verticalmente "aplasta" Frame2. Cualquier sugerencia sería muy apreciada. (He leído las respuestas sugeridas StackOverflow y ninguno parece proporcionar información que puede ser utilizada para resolver mi problema también, he buscado ampliamente en línea en vano..)

from Tkinter import * 

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.master.title("Grid Manager") 

     self.master.rowconfigure(0, weight=1) 
     self.master.columnconfigure(0, weight=1) 

     for i in range(5): 
      self.master.button = Button(master, text = "Button {0}".format(i)) 
      self.master.button.grid(row=6, column=i, sticky=W+E) 

     self.Frame1 = Frame(master, bg="red") 
     self.Frame1.grid(row = 0, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S) 
     self.Frame2 = Frame(master, bg="blue") 
     self.Frame2.grid(row = 2, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S) 
     self.Frame3 = Frame(master, bg="green") 
     self.Frame3.grid(row = 0, column = 2, rowspan = 6, columnspan = 3, sticky = W+E+N+S) 

root = Tk() 
app = Application(master=root) 
app.mainloop() 

ACTUALIZACIÓN: Ahora que estoy en mi ordenador personal, aquí están las imágenes para el resultado que quiero y el resultado que consigo, respectivamente:

WANT

GET

Respuesta

12

Después de perder el tiempo con mi código durante unas horas, finalmente pude crear la GUI que pretendía. La clave consistía en recorrer filas y columnas y configurar sus pesos mediante la configuración de fila y la configuración de columna, respectivamente. Código es el siguiente:

from tkinter import * 

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.grid() 
     self.master.title("Grid Manager") 

     for r in range(6): 
      self.master.rowconfigure(r, weight=1)  
     for c in range(5): 
      self.master.columnconfigure(c, weight=1) 
      Button(master, text="Button {0}".format(c)).grid(row=6,column=c,sticky=E+W) 

     Frame1 = Frame(master, bg="red") 
     Frame1.grid(row = 0, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S) 
     Frame2 = Frame(master, bg="blue") 
     Frame2.grid(row = 3, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S) 
     Frame3 = Frame(master, bg="green") 
     Frame3.grid(row = 0, column = 2, rowspan = 6, columnspan = 3, sticky = W+E+N+S) 

root = Tk() 
app = Application(master=root) 
app.mainloop() 

enter image description here

+2

Para cualquier persona que ejecute este ejemplo, la ventana inicialmente tiene una altura y un ancho limitados y debe cambiar su tamaño para confirmar que el código funciona. Alternativamente, dele una geometría predeterminada, 'root.geometry (" 400x200 + 200 + 200 ")' (justo después de 'root = Tk()'). –

4

Desde bastidor 1, 2 y 3 no tienen ningún widget en el interior el hombre d no les has dado ninguna altura, su tamaño natural será de un píxel de alto. Si coloca algo en frame2, o le da frame2 una altura, se mostrará.

+0

¿No es un marco un artilugio? Incluso si su altura predeterminada es de un píxel de alto, he especificado un rowspan, columnspan y los he vuelto pegajosos en todas las direcciones, así que ¿por qué no se expanden cuando cambio el tamaño de la ventana? – Jubbles

+3

@Jubbles: porque solo una fila tiene un peso> 0. Cuando cambia el tamaño, crea espacio adicional, y ese espacio adicional se llena con widgets en relación con su peso. Como solo una fila tiene un peso de 1, está diciendo "Quiero que el 100% del espacio extra vaya a esta fila" –

+0

Entiendo ahora. Tu comentario fue muy útil. – Jubbles