如何在tkinter中创建自调整大小的按钮网格?

Kir*_*ril 40 python grid tkinter button autoresize

我正在尝试使用Tkinter创建一个按钮网格(以实现可点击的单元格效果).

我的主要问题是我无法使grid按钮自动调整并适合父窗口.

例如,当我在网格上有大量按钮时,而不是缩小按钮以使网格适合窗口内部,我得到一个离开屏幕的拉伸框架.

我正在寻找的效果是网格填充所有可用空间,然后调整其单元格以适应该空间.我已阅读文档,但我仍然无法弄清楚如何使其工作.

这是基本代码,这是我的出发点:

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()
Run Code Online (Sandbox Code Playgroud)

Vau*_*ato 51

您需要将行和列配置为具有非零权重,以便它们占用额外空间:

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

for y in range(30):
    Grid.rowconfigure(grid, y, weight=1)
Run Code Online (Sandbox Code Playgroud)

您还需要配置按钮,以便它们可以展开以填充单元格:

btn.grid(column=x, row=y, sticky=N+S+E+W)
Run Code Online (Sandbox Code Playgroud)

这必须一直完成,所以这里有一个完整的例子:

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()
Run Code Online (Sandbox Code Playgroud)

  • 当您在我的系统上调整按钮大小时,您的示例没有按钮展开.我正在使用Xubuntu 14.04,32位.我在Python 2.x和3.x上都尝试过它. (2认同)

Gab*_*les 23

@Vaughn Cato在这里给出了一个很好的答案.但是,他在他的例子中不小心包含了一堆无关的代码.这是一个清理完整且更有条理的完整示例,完全符合他的示例.

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()
Run Code Online (Sandbox Code Playgroud)

截图:

首次打开时(小):

在此输入图像描述

最大化窗口后:

在此输入图像描述