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

Python 如何在tkinter中创建自动调整大小的按钮网格?,python,button,grid,tkinter,autoresize,Python,Button,Grid,Tkinter,Autoresize,我试图用Tkinter创建一个按钮网格(以实现可点击的单元格效果) 我的主要问题是我无法使网格和按钮自动调整大小并适合父窗口 例如,当网格上有大量按钮时,我得到的不是缩小按钮使网格适合窗口内部,而是一个脱离屏幕的拉伸框架 我正在寻找的效果是网格填充所有可用空间,然后调整其单元格大小以适应该空间。我已经阅读了文档,但我仍然不知道如何使其工作 这是基本代码,也是我的出发点: def __init__(self): root = Tk() frame = Frame(root)

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

我的主要问题是我无法使
网格和按钮自动调整大小并适合父窗口

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

我正在寻找的效果是网格填充所有可用空间,然后调整其单元格大小以适应该空间。我已经阅读了文档,但我仍然不知道如何使其工作

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

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

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

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

要使按钮在窗口最大化时展开,请尝试修改button.grid条目,如下所示:

btn.grid(column=x, row=y, sticky=N+S+E+W)
。然而,他意外地在他的示例中包含了一堆无关的代码。下面是一个经过清理和组织的完整示例,完全按照他的示例所做的操作

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()
截图:

第一次打开时(小):

最大化窗口后:


当您使用scrollbar(至少在Mac中)时,grid weight方法可能不起作用,因此在使用它时,将小部件和scrollbar打包到一个框架中,然后将框架网格化。

谢谢!这很有效。我不知道为什么我没有找到Grid类。我正在阅读geometry Manager文档,但只发现了.grid方法。在我的系统上调整大小时,您的示例没有按钮展开。我使用的是Xubuntu 14.04,32位。我在Python2.x和3.x上都试过了。这是一个非常有用的例子@Kiril-您也可以从对象引用调用columnconfigure,例如root.rowconfigure(0,weight=1)@Vaughn Cato,谢谢您的回答!你的完整示例中有一些无关的代码,因此我在刚刚发布的回答中发布了一个经过清理的示例,并包含了屏幕截图。python27的语法是sticky='nsew'(not sticky=N+S+E+W)我复制并粘贴了这个精确的示例,在使用python 3.6.4的OS X 10.13.4上,它的大小水平调整为'we',而不是垂直调整为'ns'。我不知道为什么,但是你的代码在我的windows机器上运行得很好。我发现,如果我使用ttk模块的按钮,调整大小的工作原理与您演示的一样。所以OS X用户要注意,使用tkinter.ttk.Button而不是tkinter.Button,否则这将不起作用。如何在使用多个类的程序中实现这一点?将同一个按钮复制XxY次即可。当您希望在同一个网格中有XxY个不同的按钮时会发生什么?我尝试将所有按钮上的行/列设置为行/列索引,但只有一个按钮显示了XxY次。变量不是递增的。