Как создать сетку кнопок для изменения размера в tkinter?
Я пытаюсь создать сетку кнопок (для того, чтобы добиться эффекта кликабельной ячейки) с помощью Tkinter.
Моя основная проблема заключается в том, что я не могу сделать grid
и кнопки авторезистировать и вставить родительское окно.
Например, когда у меня есть большое количество кнопок на сетке, вместо того, чтобы сжимать кнопки, чтобы сетка помещалась внутри окна, я получаю растянутый кадр, который выходит из экрана.
Эффект, который я ищу, - это сетка, заполняющая все доступное пространство, а затем изменение размеров его ячеек, чтобы соответствовать этому пространству. Я прочитал документацию, но я все еще не могу понять, как заставить ее работать.
Это базовый код, который является отправной точкой:
def __init__(self):
root = Tk()
frame = Frame(root)
frame.grid()
#some widgets get added in the first 6 rows of the frame 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()
Ответы
Ответ 1
Вам нужно настроить строки и столбцы на ненулевой вес, чтобы они заняли дополнительное пространство:
for x in range(60):
Grid.columnconfigure(grid, x, weight=1)
for y in range(30):
Grid.rowconfigure(grid, y, weight=1)
Вам также нужно настроить свои кнопки так, чтобы они расширялись, чтобы заполнить ячейку:
btn.grid(column=x, row=y, sticky=N+S+E+W)
Это нужно сделать до конца, так что вот полный пример:
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()
Ответ 2
@Вон Катон дал отличный ответ здесь. Тем не менее, он случайно включил в свой пример кучу постороннего кода. Вот вычищенный и более организованный полный пример, который делает именно то, что делает его пример.
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()
Скриншоты:
Когда он сначала открывается (маленький):
![введите описание изображения здесь]()
После того, как вы максимизируете окно:
![введите описание изображения здесь]()
Ответ 3
Чтобы кнопки расширялись при максимальном увеличении окна, попробуйте изменить запись button.grid следующим образом:
btn.grid(column=x, row=y, sticky=N+S+E+W)