web-dev-qa-db-fra.com

Comment créer une grille de boutons à redimensionnement automatique dans tkinter?

J'essaie de créer une grille de boutons (afin d'obtenir l'effet de cellule cliquable) avec Tkinter.

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

Par exemple, lorsque j'ai un nombre élevé de boutons sur la grille, au lieu de rétrécir les boutons pour que la grille s'adapte à l'intérieur de 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.

Voici 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()
39
Kiril

Vous devez configurer les lignes et les colonnes pour qu'elles aient un poids différent de zéro afin qu'elles occupent 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 pour qu'ils développez pour remplir la cellule:

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

Cela doit être fait tout le long, alors 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()
50
Vaughn Cato

@ Vaughn Cato a donné une excellente réponse ici . Cependant, il a accidentellement inclus un tas de code étranger dans son exemple. Voici un exemple complet nettoyé et plus organisé faisant exactement ce que fait son exemple.

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 s'ouvre pour la première fois (petit):

enter image description here

Après avoir agrandi la fenêtre:

enter image description here

22
Gabriel Staples

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

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