2010-05-04 16 views
7

¿Es posible colocar una cuadrícula de botones en Tkinter dentro de otro marco?¿Cuadrícula dentro de un marco?

Estoy queriendo crear un juego tipo tic-tac-toe y quiero usar la función de cuadrícula para poner los cuadrados de los juegos (que serán los botones). Sin embargo, me gustaría tener otras cosas en la GUI aparte del tablero, por lo que no es ideal tener todo en una sola grilla.

Para ilustrar:

O | X | X | 
---------- | 
O | O | X | Player 2 wins! 
---------- | 
X | O | X | 

La junta de tres en raya es en una cuadrícula que se compone de todos los botones y el 'jugador 2 victorias' es una etiqueta dentro de un marco.

Esto es una simplificación excesiva de lo que estoy tratando de hacer, así que tengan paciencia conmigo, por la forma en que he diseñado el programa hasta ahora (la placa se crea dinámicamente) una cuadrícula tiene más sentido.

Edit: Tuve un pensamiento, pero cuando lo ejecuto, no pasa nada? Si saco el bit de marco, lo hace. ¿Algunas ideas?

from Tkinter import * 

root = Tk() 

b = Button(root, text = "1") 
b.grid(row=1, column=3) 
b2 = Button(root, text = "2") 
b2.grid(row=1, column=4) 

f = Frame(root, bg = "red") 
f.pack(side=RIGHT) 

root.mainloop() 
+0

El motivo por el que parece que no ocurre nada es que está utilizando tanto la cuadrícula como el paquete en el mismo elemento primario (b.grid() y f.pack() afectan al widget raíz). Esto puede causar todo tipo de mal comportamiento. Dentro de un solo contenedor debe usar solo uno u otro. Dentro de la aplicación como un todo, puede mezclarlos todo lo que desee, siempre y cuando no los use directamente en el mismo contenedor. –

Respuesta

7

descubierto una manera de hacerlo por último:

from Tkinter import * 

root = Tk() 

f = Frame(root, bg = "orange", width = 500, height = 500) 
f.pack(side=LEFT, expand = 1) 

f3 = Frame(f, bg = "red", width = 500) 
f3.pack(side=LEFT, expand = 1, pady = 50, padx = 50) 

f2 = Frame(root, bg = "black", height=100, width = 100) 
f2.pack(side=LEFT, fill = Y) 

b = Button(f2, text = "test") 
b.pack() 

b = Button(f3, text = "1", bg = "red") 
b.grid(row=1, column=3) 
b2 = Button(f3, text = "2") 
b2.grid(row=1, column=4) 
b3 = Button(f3, text = "2") 
b3.grid(row=2, column=0) 

root.mainloop() 

Tener la red dentro de un marco dentro de un marco es un poco de un truco para conseguir el relleno alrededor de la rejilla de trabajo pero funciona, así que estoy contento.

+2

La cuadrícula no es una "cosa", es un método que utilizan los widgets para organizarse dentro de un marco; tenga en cuenta que no hay 'Cuadrícula' construida.Este es el modelo de composición Tk, es similar al de TeX, que a su vez se derivó de 500 años de experiencia en impresión. Cajas anidadas es el método que hemos encontrado para organizar objetos similares al texto: no es un truco. – msw

+0

Gran respuesta = me ayudó con un problema con el que he estado luchando durante días. – xxmbabanexx

1

Puede anidar Tk widgets de manera arbitraria. Dijo el manual:

El tamaño de cualquier control principal está determinado por el tamaño de los “esclavos widgets” en el interior. El empacador se usa para controlar donde los widgets esclavos aparecen dentro del maestro en el que están empaquetados. Puede empaquetar widgets en marcos y marcos en otros marcos, para lograr el tipo de diseño que desee. Además, la disposición se ajusta dinámicamente a para adaptarse a los cambios incrementales a la configuración , una vez que está empaquetada.

De hecho, un cuadro que contiene un (marco de botones) y una etiqueta es la forma en que debe estructurar el diseño que describe.

+0

¿Estás diciendo que lo que estoy preguntando no es posible? Sé que puedo poner un marco dentro de un marco, pero ¿sería posible colocar una cuadrícula dentro de un marco? – Sam

+1

@Sam: no puede "colocar una grilla dentro de un marco" porque una grilla no es algo que pueda colocar. El método grid() simplemente establece widgets en un contenedor. No está "agregando una cuadrícula", simplemente está "colocando widgets en un patrón de cuadrícula". Y, como dice la respuesta, puedes anidar los widgets Tk arbitrariamente en profundidad (aunque en mis muchos años de experiencia, raramente necesitas tener más de 3 o 4 de profundidad). –

Cuestiones relacionadas