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