.grid()小部件

时间:2015-07-29 19:03:26

标签: python python-3.x dictionary graphics tkinter

我有一个游戏板,它是行x列列表。

最小尺寸为2x2,最大尺寸为10x10,行数不相等:列正常(例如2x3,4x9)。

主窗口对象没有预先确定的几何尺寸设置,并且窗口小部件(按钮)中的每个列表元素都是.grid(),用于创建2D地图。

理想情况下,给定使用的方法,这将导致主窗口内的一个漂亮的edge = to-edge映射。

不幸的是,测试表明,对于列数为>的地图,情况确实如此。如图3所示,当列< = 3时,窗口似乎默认为某个X大小,其中这个丑陋的自由空间出现在窗口的右侧。 Y轴不是这种情况,它由行定义。

请注意,放置的按钮固定为32x32像素(由图像内部确定)。

def createMap (): #creates rows x columns 2D list - a map
    global rowsEntryVar, columnsEntryVar, mapList
    mapList = []
    for row in range(rowsEntryVar):
        tempList = []
        for column in range(columnsEntryVar):
            tempList.append(Button(root, bd=0, bg=redMagenta, activebackground=redMagenta))
        mapList.append(tempList)

然后:

def drawMap ():
    global mapList
    for row in range(len(mapList)):
        for column in range(len(mapList[row])):
            mapList[row][column].grid(row=row, column=column)

图像:

Image showing the problem

请放轻松我,我对编程很新。 :)

2 个答案:

答案 0 :(得分:1)

当列< = 3时,窗口似乎默认为某个X大小,

Tkinter默认为窗口小部件的大小,因此您必须在某处设置“root”的几何体。以下在我的Slackware框中工作正常(并且使用函数作为函数消除了全局变量)。如果你刚刚开始,那么养成良好的习惯是很好的,比如符合Python样式指南https://www.python.org/dev/peps/pep-0008/(变量和函数都是带有下划线的小写)。

from Tkinter import *

def create_map (rowsEntryVar, columnsEntryVar): #creates rows x columns 2D list - a map
    mapList = []
    for row in range(rowsEntryVar):
        tempList = []
        for column in range(columnsEntryVar):
            tempList.append(Button(root, text="%s-%s" % (row, column),
                            bd=0, bg="magenta2", activebackground=r"magenta3"))
        mapList.append(tempList)
    return mapList

def draw_map(mapList):
    for row in range(len(mapList)):
        for column in range(len(mapList[row])):
            mapList[row][column].grid(row=row, column=column)


root = Tk()
map_list=create_map(4, 3)
draw_map(map_list)
root.mainloop()

答案 1 :(得分:1)

这似乎是特定于平台的限制。我无法在Mac上复制问题,但我可以在Windows VM上复制。显然,Windows不允许窗口宽度小于标题栏上按钮和图标所需的空间。

我的建议是给行和列一个正的权重,使它们增长到适合窗口,然后使用sticky选项使按钮填充给它们的空间。