【问题标题】:Combining grid/pack Tkinter结合grid/pack Tkinter
【发布时间】:2012-06-29 07:28:58
【问题描述】:

我知道过去有很多关于 grid 和 pack 的问题,但我只是不明白如何将两者结合起来,因为我很难在两个方向(行/列)上扩展我的“表格”。

按钮我希望保持相同的大小,但始终保持在窗口的底部。 但是,我希望通过调整窗口大小来自动扩展“表格”,但似乎无法使其正常工作。将 'win1' 改为 pack 在某种意义上是有效的,因为它保持在中心位置,但仅此而已。

我知道我需要更改术语,因此如何使用 pack 实现相同的效果,例如粘性等。

代码如下(显示基本框架和几个小部件,不是完整代码):

root = Tk()  

win1 = Frame(root)
win1.pack()
win1.grid_columnconfigure(0, weight=1)
win1.grid_rowconfigure(1, weight=1)

frame_table = ttk.Frame(win1, style="Black.TLabel", relief='sunken', borderwidth=1)
frame_table.pack(row=2, column=0, padx=1, pady=1, sticky= "nsew")
frame_table.grid_columnconfigure(0, weight=1)
frame_table.grid_rowconfigure(1, weight=1)
text_table1 = Label(frame_table, text='Number1', bg='white', borderwidth=0)
text_table1.grid(row=1, column=0, sticky="nsew", padx=1, pady=1)
empty1 = Label(frame_table, bg='white', borderwidth=0)
empty1.grid(row=2, column=0, sticky="nsew", padx=1, pady=1)
text_table2 = Label(frame_table, text='Number2', bg='white', borderwidth=0, width=12)
text_table2.grid(row=1, column=1, sticky="nsew", padx=1, pady=1)
empty2 = Label(frame_table, bg='white', borderwidth=0)
empty2.grid(row=2, column=1, sticky="nsew", padx=1, pady=1)

frame_but = ttk.Frame(win1)
frame_but.grid(sticky=S, padx=1, pady=1)
frame_but.grid_columnconfigure(0, weight=1)
frame_but.grid_rowconfigure(1, weight=1)
but1 = ttk.Button(frame_but, text='Start', command=Start)
but1.grid(row=3, column=0, padx=2, pady=1, sticky="S")

【问题讨论】:

    标签: python tkinter ttk


    【解决方案1】:

    您的第一个问题是主框架win1 没有任何选项。默认情况下,它填充它所在的容器部分。因此,无论你对内部小部件做什么,整个东西都会堆叠锚定到窗口的顶部.那么,你应该做的第一件事就是告诉win1 填满整个窗口(假设这实际上是你想要它做的):

    win1.pack(side="top", fill="both", expand=True)
    

    这将导致该框架在您调整窗口大小时正确扩展和收缩。

    第二个问题是您将win 中的第 0 行的权重为 1,但您将 frame_table 放入默认权重为 0 的第 3 行。我不知道这是故意的还是不是,但这就是将标签和条目小部件固定在屏幕底部的原因,因为win1 的空行 0 正在扩大和缩小以占用额外的空间。

    如何学习布局小部件

    正确的调整大小行为很容易做到,但要学习如何做到正确却相当困难。我的建议是,准备一些纸和一支铅笔。画出应用程序的主要区域——每个区域都有不同的属性。例如,底部的一行应该留在底部(状态栏,或者可能是一排按钮)。也许顶部的某些东西(例如工具栏)应该留在顶部,等等。通常只有一个区域是可扩展的,尽管该可扩展区域本身可能分为两个或多个区域。

    在这种情况下,我猜您有两个区域:一个表格和一排按钮。画出来很容易。接下来,为每个区域创建一个框架,为每个区域创建一个框架。给它们单独的背景颜色,并使用网格或包将它们放置在窗口中,无论哪一种都可以为您提供所需的调整大小行为。如果您有一个简单的布局(每个区域都从上到下或从左到右粘贴),pack 非常棒,如果您真的有一个网格,那么网格就很棒。使用这个,调整选项,直到你得到你想要的主要区域的行为。不同的颜色将帮助您查看哪些区域正在调整大小,哪些没有。

    一旦您的主要区域工作正常,您就可以开始关注内部部分。再次拿出那支铅笔和纸,对每个子区域做同样的事情。画出内部区域,找出哪些会在容器内生长,哪些不会。也许只有一个主要的子区域,所以你可以跳过这部分。最后,如果您有子区域,请创建框架,再次为它们提供不同的颜色,以便您可以看到正在调整大小的内容。调整设置,直到一切都按照您想要的方式调整大小。起泡,冲洗,重复。

    最后,您将无法再细分您的窗口。通常只有几个区域,所以这个过程很快。一旦您将程序的不同区域全部调整为您想要的大小,就该添加实际的小部件了。完成后,您可以返回并从框架中删除颜色。

    这很简单,但需要有条不紊的方法。只是将一堆小部件放入一个框架中并尝试随机的事情来让它工作是不是正确的方法。有条不紊,在纸上布置您的设计,转移到具有不同颜色的框架上,然后添加您真正的小部件并添加最后的润色。

    【讨论】:

    • 很好的答案,非常感谢!在过去的几天里,我一直在一点一点地学习 Tkinter,并开始了解其中的一些内容。无济于事我也不是python本身的大师,但这个答案是完美的!
    • 描述该方法的好答案。但是您没有明确说明的是您是否可以将网格/包装组合在一起。如果我使用网格来承载框架,那么在框架内使用 pack 是否安全 - 或者 - 我应该选择一个并坚持使用它吗?
    • @bryanbcook:见stackoverflow.com/a/17267402/7432stackoverflow.com/a/3968033/7432,也许还有stackoverflow.com/a/23504912/7432。还有其他人解决了非常相似的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2013-02-06
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多