2011-09-29 6 views
26

J'essaye de créer une grille de boutons (afin d'obtenir l'effet de cellule cliquable) avec Tkinter.Comment créer une grille de boutons de redimensionnement automatique dans tkinter?

Mon principal problème est que je ne peux pas faire le grid et les boutons autoresize et s'adapter à la fenêtre parente. Par exemple, quand j'ai un nombre élevé de boutons sur la grille, au lieu de rétrécir les boutons pour que la grille s'insère dans la fenêtre, j'obtiens un cadre étiré qui disparaît de l'écran.

L'effet que je recherche est la grille remplissant tout l'espace disponible, puis redimensionnant ses cellules pour s'adapter à cet espace. J'ai lu la documentation, mais je n'arrive toujours pas à comprendre comment la faire fonctionner.

Ceci est le code de base qui est mon point de départ:

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

Répondre

39

Vous devez configurer les lignes et les colonnes d'avoir un poids non nul afin qu'ils prendront l'espace supplémentaire:

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

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

Vous devez également configurer vos boutons afin qu'ils dilater pour remplir la cellule:

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

Cela doit être fait tout le chemin, voici donc un exemple complet:

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

Merci! Cela a bien fonctionné. Je ne sais pas pourquoi je n'ai pas trouvé la classe Grid. Je lisais dans la documentation des gestionnaires de géométrie, mais découvre seulement la méthode .grid. – Kiril

+1

Votre exemple ne voit pas les boutons se développer lorsque vous le redimensionnez sur mon système. J'utilise Xubuntu 14.04, 32 bits. Je l'ai essayé sur Python 2.x et 3.x. – Shule

+0

Exemple très utile. @Kiril - vous pouvez également appeler columnconfigure à partir d'une référence d'objet, par ex. root.rowconfigure (0, weight = 1) – NargothBond

2

Pour faire les boutons lorsque la fenêtre se dilatent est maximisée, essayez de modifier l'entrée de button.grid comme suit :

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

@Vaughn Cato gave an excellent answer here. Cependant, il a accidentellement inclus un tas de code étranger dans son exemple. Voici un exemple complet nettoyé et mieux organisé faisant exactement ce que son exemple fait.

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

Captures d'écran:

Quand il ouvre d'abord (petit):

enter image description here

Une fois que vous agrandissez la fenêtre:

enter image description here

Questions connexes