2010-05-04 33 views
7

È possibile posizionare una griglia di pulsanti in Tkinter all'interno di un altro frame?Griglia all'interno di una cornice?

Sto cercando di creare un gioco simile a un tic-tac-toe e voglio usare la funzione di griglia per mettere le tabelle dei giochi (che saranno i pulsanti). Tuttavia, mi piacerebbe avere altre cose nella GUI oltre al semplice tavolo da gioco, quindi non è l'ideale per avere tutto nella stessa griglia.

Per chiarire:

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

La scheda Tris è in una griglia che si compone di tutti i pulsanti e gli 'giocatore vince 2' è un'etichetta all'interno di un frame.

Questa è una semplificazione eccessiva di ciò che sto cercando di fare, quindi portami con me, per il modo in cui ho progettato il programma finora (la scheda è stata creata dinamicamente) una griglia ha più senso.

Modifica: ho avuto un pensiero ma quando lo eseguo, non succede niente? Se tolgo il frame bit lo fa. Qualche idea?

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

La ragione per cui non sembra accadere nulla è che si sta utilizzando sia grid sia pack nello stesso genitore (b.grid() e f.pack() hanno entrambi effetto sul widget radice). Questo può causare ogni sorta di cattivo comportamento. All'interno di un singolo contenitore dovresti usare solo uno o l'altro. All'interno della tua applicazione puoi mescolarli tutto ciò che vuoi purché non li usi entrambi nello stesso contenitore. –

risposta

7

trovato un modo per farlo finalmente:

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() 

Avere la griglia all'interno di una cornice all'interno di una cornice è un po 'di hack per ottenere l'imbottitura intorno alla griglia di lavoro ma funziona, quindi sono contento.

+2

La griglia non è una "cosa", è un metodo che i widget usano per sistemarsi all'interno di una cornice; si noti che non è stata costruita la griglia.Questo è il modello di composizione Tk, è simile a quello di TeX che è stato derivato da 500 anni di esperienza di stampa. Le caselle annidate sono il metodo che abbiamo trovato per organizzare oggetti di tipo testo: non è un hack. – msw

+0

Ottima risposta = mi ha aiutato con un problema con cui ho lottato per giorni. – xxmbabanexx

1

È possibile nidificare i widget Tk arbitrariamente in profondità. Disse il manual:

La taglia di un widget di Master è determinata dalla dimensione dei “slave widget” all'interno. Il packer viene utilizzato per il controllo dove i widget slave appaiono all'interno del master in cui sono imballati. . È possibile impacchettare i widget nei fotogrammi e nei fotogrammi in altri fotogrammi, per ottenere il tipo di layout desiderato. Inoltre, la disposizione viene adattata dinamicamente a e accetta modifiche incrementali alla configurazione , una volta imballata.

Infatti, un frame contenente un (frame di pulsanti) e un'etichetta è come è necessario strutturare il layout che descrivi.

+0

Stai dicendo che ciò che sto chiedendo non è possibile? So che posso mettere un frame all'interno di un frame ma sarebbe possibile posizionare una griglia all'interno di un frame? – Sam

+1

@ Sam: non è possibile "posizionare una griglia all'interno di una cornice" perché una griglia non è qualcosa che è possibile inserire. Il metodo grid() mette semplicemente i widget fuori in un contenitore. Non stai "aggiungendo una griglia", stai semplicemente "posando i widget in una griglia". E, come dice la risposta, puoi annidare arbitrariamente i widget Tk in modo arbitrario (anche se nei miei molti anni di esperienza, raramente hai bisogno di andare più di 3 o 4 in profondità). –

Problemi correlati