【问题标题】:Python tkinter main window improper size when .grid() widgets当 .grid() 小部件时,Python tkinter 主窗口大小不正确
【发布时间】:2015-07-29 19:03:26
【问题描述】:

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

最小大小为 2x2,最大 10x10,不等行:列可以(例如 2x3、4x9)。

主窗口对象没有预先确定的几何尺寸设置,小部件(按钮)在其中为创建 2D 地图的每个列表元素提供 .grid()。

理想情况下,考虑到所使用的方法,这将在主窗口内产生一个很好的边缘=边缘映射。

不幸的是,测试表明,虽然这对于列数 > 3 的地图是正确的,但当列数

请注意,放置的按钮固定为 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

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

【问题讨论】:

  • 您使用place 而不是grid 有什么原因吗? grid 使创建类似网格的布局变得更加容易。
  • 该死,我在写这个问题的时候一定是脑残了......显然我使用了.grid()方法

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    当列

    Tkinter 默认为小部件的大小,因此您必须在某处设置“根”的几何形状。以下在我的 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. 我 100% 确定我没有为 root 设置 geomtery,2. 您的代码在 Py 3.4.3 中的 Win7 上仍然存在同样的问题,请参阅链接图片link, 3. 我知道 Py 样式,但是因为我讨厌下划线,所以我坚持 JS 样式:)
    猜你喜欢
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2011-05-18
    • 2014-08-29
    • 1970-01-01
    • 2018-03-01
    • 2012-07-31
    • 1970-01-01
    相关资源
    最近更新 更多