2011-09-29 13 views
26

Sto cercando di creare una griglia di pulsanti (per ottenere l'effetto cella selezionabile) con Tkinter.Come creare una griglia di pulsanti di ridimensionamento automatico in tkinter?

Il mio problema principale è che non riesco a fare il grid ei pulsanti Dimensioni automatiche e adattarsi alla finestra padre.

Ad esempio, quando ho un numero elevato di pulsanti sulla griglia, invece di restringere i pulsanti in modo che la griglia si adatti alla finestra, ottengo una cornice allungata che va fuori dallo schermo.

L'effetto che sto cercando è la griglia di riempire tutto lo spazio disponibile, quindi il ridimensionamento sue cellule per adattarsi all'interno di quello spazio. Ho letto alla documentazione, ma non riesco ancora a capire come farlo funzionare.

Questo è il codice di base che è il mio punto di partenza:

def __init__(self): 
    root = Tk() 
    frame = Frame(root) 
    frame.grid() 

    #some widgets get added in the first 6 rows of the frame's grid   

    #initialize grid 
    grid = Frame(frame) 
    grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2) 

    #example values 
    for x in range(60): 
     for y in range(30): 
      btn = Button(grid) 
      btn.grid(column=x, row=y) 

    root.mainloop() 

risposta

39

È necessario configurare le righe e le colonne di avere un peso diverso da zero in modo che essi occupano lo spazio in più:

for x in range(60): 
    Grid.columnconfigure(grid, x, weight=1) 

for y in range(30): 
    Grid.rowconfigure(grid, y, weight=1) 

È inoltre necessario configurare i pulsanti in modo che possano espandersi per riempire la cella:

btn.grid(column=x, row=y, sticky=N+S+E+W) 

questo deve essere fatto tutta la strada fino, ecco un esempio completo:

from tkinter import * 

root = Tk() 
frame=Frame(root) 
Grid.rowconfigure(root, 0, weight=1) 
Grid.columnconfigure(root, 0, weight=1) 
frame.grid(row=0, column=0, sticky=N+S+E+W) 
grid=Frame(frame) 
grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2) 
Grid.rowconfigure(frame, 7, weight=1) 
Grid.columnconfigure(frame, 0, weight=1) 

#example values 
for x in range(10): 
    for y in range(5): 
     btn = Button(frame) 
     btn.grid(column=x, row=y, sticky=N+S+E+W) 

for x in range(10): 
    Grid.columnconfigure(frame, x, weight=1) 

for y in range(5): 
    Grid.rowconfigure(frame, y, weight=1) 

root.mainloop() 
+1

Grazie! Ha funzionato alla grande Non sono sicuro del motivo per cui non ho trovato la classe Grid. Stavo leggendo la documentazione sui geometri, ma ho scoperto solo il metodo .grid. – Kiril

+1

L'esempio non prevede che i pulsanti si espandano quando lo ridimensioni sul mio sistema. Sto usando Xubuntu 14.04, 32-bit. L'ho provato su Python 2.xe su 3.x. – Shule

+0

Esempio molto utile. @ Kiril: puoi anche chiamare columnconfigure da un riferimento a un oggetto, ad es. root.rowconfigure (0, weight = 1) – NargothBond

2

Per rendere i pulsanti si espandono quando la finestra è massimizzata, provare a modificare la voce button.grid come segue :

btn.grid(column=x, row=y, sticky=N+S+E+W) 
7

@Vaughn Cato gave an excellent answer here. Tuttavia, nel suo esempio ha accidentalmente incluso un gruppo di codice estraneo. Ecco un esempio completo ripulito e più organizzato che fa esattamente ciò che fa il suo esempio.

from tkinter import * 

#Create & Configure root 
root = Tk() 
Grid.rowconfigure(root, 0, weight=1) 
Grid.columnconfigure(root, 0, weight=1) 

#Create & Configure frame 
frame=Frame(root) 
frame.grid(row=0, column=0, sticky=N+S+E+W) 

#Create a 5x10 (rows x columns) grid of buttons inside the frame 
for row_index in range(5): 
    Grid.rowconfigure(frame, row_index, weight=1) 
    for col_index in range(10): 
     Grid.columnconfigure(frame, col_index, weight=1) 
     btn = Button(frame) #create a button inside frame 
     btn.grid(row=row_index, column=col_index, sticky=N+S+E+W) 

root.mainloop() 

Screenshots:

Quando si apre la prima (piccola):

enter image description here

Dopo aver massimizzare la finestra:

enter image description here

Problemi correlati