Tkinter的粘性不工作的一些帧(tkinter sticky not working for s

2019-10-24 14:08发布

我使用的Tkinter写的纸牌游戏,和我在与他网格布局管理器“粘性”配置的麻烦。 我想帮助我的固定代码,使框架在所需位置显示。 在我的代码和以下说明中,有一帧包含两个其它(b2)的(一个绿色,B2A;和一个红色; B2B)帧。 我想在父帧(B)的底部,以显示帧B2。 我已经试过N + S + E + W的各种组合作为“粘性”的参数,为两个帧B2和子帧B2A和B2B。 不过,我一直无法作出帧B2(更重要的B2A和B2B)出现在所需位置(下面的正确位置底部图像在Illustrator制造)。

特别地,似乎在线27,36和37粘参数对帧B2,B2A和B2B的帧B内的位置没有影响。

from tkinter import *
from PIL import Image, ImageTk

def main(root):
    cons = Frame(root)
    cons.grid()

    frameDict = setup_frames(cons)
    populate_frames(frameDict)

def setup_frames(cons):
    frame = {}
    # Parental Frames
    frame['a'] = Frame(cons, borderwidth=2, relief='groove')
    frame['b'] = Frame(cons, borderwidth=2, relief='groove')
    frame['c'] = Frame(cons, borderwidth=2, relief='groove')

    frame['a'].grid(row=0, column=0, sticky=N+S+E+W)
    frame['b'].grid(row=0, column=1, sticky=N+S+E+W)
    frame['c'].grid(row=1, column=0, columnspan=2)

    # Progeny 0 Frames:
    frame['b1'] = Frame(frame['b'], borderwidth=2, relief='groove')
    frame['b2'] = Frame(frame['b'], borderwidth=2, relief='groove')

    frame['b1'].grid(row=0, column=0, sticky=N+S+E+W)
    frame['b2'].grid(row=1, column=0, sticky=N+S+E+W)

    # Progeny 1 Frames:

    frame['b2a'] = Frame(frame['b2'], borderwidth=2, relief='groove',
                         background='green')
    frame['b2b'] = Frame(frame['b2'], borderwidth=2, relief='groove',
                         background='red')

    frame['b2a'].grid(row=0, column=0, sticky=S)
    frame['b2b'].grid(row=0, column=1, sticky=SW)

    return frame

def populate_frames(fr):

    # Populating 'a' frame
    aLab = Label(fr['a'], image=img[0])
    aLab.grid()

    # Populating b2a & b2b frames
    bLab = Label(fr['b2a'], image=img[1])
    bLab.grid(row=0, column=0)

    bLab = Label(fr['b2b'], image=img[2])
    bLab.grid(row=0, column=1)

    # Populating c1 frame
    cLab = Label(fr['c'], image=img[3])
    cLab.grid()

if __name__ == '__main__':
    root = Tk()
    img = []
    w = [40,  160, 80, 480]
    h = [180, 60,  60, 60]
    for i in range(4):
        a = Image.new('RGBA', (w[i], h[i]))
        b = ImageTk.PhotoImage(a)
        img.append(b)
    main(root)

下面的图像示出了其中有问题的帧(绿色和红色)的显示(顶部)和在那里我想他们显示(底部)。

可能有人请帮我显示帧B2(最终B2A和B2B)在正确的位置(编辑:在框架B的底部,并从框架的右侧跨越到帧c的右侧)?

更新:我已经使用网格的权重解决了这两个问题(垂直放置和帧B2的水平对齐),为布赖恩建议。 在垂直放置问题的解决方法很简单,但我不会预测解决水平对齐问题。

我通过给权重= 1解决了垂直放置问题帧B与行0(导致如下图的上图)。

我解决了水平对齐问题通过在帧B分配权重= 1到第0列(其中的帧B1和B2没有拉伸以填充帧b)中。 所述框架在下面显示图该帧B已经从一帧的右侧延伸到帧c的右侧轮廓。 很奇怪,我认为在一帧赋予权重的唯一列将被要求允许孩子帧水平填补。 在任何情况下,我已经粘贴下面我工作的代码。 线40和41解决我遇到的问题。

from tkinter import *
from PIL import Image, ImageTk

def main(root):
    cons = Frame(root)
    cons.grid()

    frameDict = setup_frames(cons)
    populate_frames(frameDict)

def setup_frames(cons):
    frame = {}
    # Parental Frames
    frame['a'] = Frame(cons, borderwidth=2, relief='groove')
    frame['b'] = Frame(cons, borderwidth=2, relief='groove')
    frame['c'] = Frame(cons, borderwidth=2, relief='groove')

    frame['a'].grid(row=0, column=0, sticky=N+S+E+W)
    frame['b'].grid(row=0, column=1, sticky=N+S+E+W)
    frame['c'].grid(row=1, column=0, columnspan=2)

    # Progeny 0 Frames:
    frame['b1'] = Frame(frame['b'], borderwidth=2, relief='groove')
    frame['b2'] = Frame(frame['b'], borderwidth=2, relief='groove')

    frame['b1'].grid(row=0, column=0, sticky=N+S+E+W)
    frame['b2'].grid(row=1, column=0, sticky=N+S+E+W)

    # Progeny 1 Frames:

    frame['b2a'] = Frame(frame['b2'], borderwidth=2, relief='groove',
                         background='green')
    frame['b2b'] = Frame(frame['b2'], borderwidth=2, relief='groove',
                         background='red')

    frame['b2a'].grid(row=0, column=0, sticky=S)
    frame['b2b'].grid(row=0, column=1, sticky=SW)

    # Weighting
    frame['b'].grid_rowconfigure(0, weight=1)
    frame['b'].grid_columnconfigure(0, weight=1)

    return frame

def populate_frames(fr):

    # Populating 'a' frame
    aLab = Label(fr['a'], image=img[0])
    aLab.grid()

    # Populating b2a & b2b frames
    bLab = Label(fr['b2a'], image=img[1])
    bLab.grid(row=0, column=0)

    bLab = Label(fr['b2b'], image=img[2])
    bLab.grid(row=0, column=1)

    # Populating c1 frame
    cLab = Label(fr['c'], image=img[3])
    cLab.grid()

if __name__ == '__main__':
    root = Tk()
    img = []
    w = [40,  160, 80, 480]
    h = [180, 60,  60, 60]
    for i in range(4):
        a = Image.new('RGBA', (w[i], h[i]))
        b = ImageTk.PhotoImage(a)
        img.append(b)
    main(root)

与布赖恩的建议相一致,它似乎是一个很好的经验规则来分配权重,以至少一列,并在每个容器一行。

这里是之前和之后我固定的水平对齐问题:

使用Python 3.4,优胜美地

Answer 1:

你必须给予一定的行和列的权重,这样的Tkinter知道如何分配额外的空间。

作为一个经验法则使用时grid ,每一个使用容器电网应该给至少一行和一吨的重量。

我会做的是重新开始。 有条理。 取得的主要三个方面的工作首先解决其他问题之前。 是什么使得这一问题难以解决的是,没有什么是正确的行为,所以你想一次调整很多东西。 专注于一个领域的时间,得到它的工作刚刚好,然后继续前进。

鉴于你的图, pack似乎是一个比使用格根窗口的儿童使用内部网使用可能会造成混淆其他帧帧的内网更简单的解决方案。

它看起来像架C是某种跨底部延伸的状态栏,所以第一个包装。 上面说你有两个领域 - 帧是左,看起来是一个固定的宽度,并且框架C的权利和占用所有的额外空间。 使用包,它应该是这样的:

frame['c'].pack(side="bottom", fill="x")
frame['a'].pack(side="left", fill="y")
frame['b'].pack(side="right", fill="both", expand=True)

当然,你可以得到完全相同的外观与网格,但因为你必须给列1和行1的权重将采取的代码一对夫妇更行。

这应该得到的三个主要方面的工作就好了。 现在你需要担心的是帧B的内容

你的图表显示了要B2A和B2B在框架B的底部,与它上面更多的widget。 那是对的吗? 如果是这样的话,你需要离开至少一个额外行的上方以填充额外的空间。

该空行与正权重将迫使所有的部件的朝底部区域移动。 因为他们需要垂直他们将只占据尽可能多的空间,与空行与非零权重占用了所有的额外费用。

然后你只需要担心的水平放置。 目前还不清楚你期望什么,但解决方案再次给周围重量栏旋转。 如果你想同时B2A和B2B平等地扩大,给两列相同的权重。 如果你想B2A做所有的不断扩大,给仅列权重为零。



文章来源: tkinter sticky not working for some frames