Comment créer une grille de boutons auto redimensionnement en tkinter?

j'essaie de créer une grille de boutons(pour obtenir l'effet cellule cliquable) avec Tkinter.

mon problème principal est que je ne peux pas faire le grid et les boutons s'ajustent automatiquement à la fenêtre parent.

par exemple, quand j'ai un grand nombre de boutons sur la grille, au lieu de les rétrécir pour que la grille s'adapte à l'intérieur de la fenêtre, j'obtiens un cadre étiré qui sort de l'écran.

L'effet que je cherche, c'est la grille remplir tout l'espace disponible, puis redimensionner ses cellules pour s'adapter à l'intérieur de cet espace. J'ai lu la documentation, mais je ne sais toujours pas comment la faire fonctionner.

<!-C'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()
31
demandé sur nbro 2011-09-29 04:54:48

3 réponses

Vous devez configurer les lignes et les colonnes ont un non-zéro de poids afin qu'ils prennent de 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 développer pour remplir la cellule:

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

Ce qui doit être fait tout le chemin jusqu'à, donc, voici 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()
42
répondu Vaughn Cato 2015-06-26 13:10:28

@Vaughn Cato a donné une excellente réponse ici. Cependant, il a accidentellement inclus un tas de code superflu dans son exemple. Voici un exemple complet nettoyé et plus 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 son premier (petit):

enter image description here

après avoir maximisé la fenêtre:

enter image description here

16
répondu Gabriel Staples 2017-05-23 11:55:03

pour étendre les boutons lorsque la fenêtre est maximisée, essayez de modifier le bouton.grille d'entrée comme suit:

btn.grid(column=x, row=y, sticky=N+S+E+W)
2
répondu Tony Waite 2015-04-30 08:13:48