Tkinter框架和网格

时间:2017-10-27 18:55:35

标签: python tkinter

对于我的生活,我无法理解grid中的Frame。我试图创建以下配置,但我得到了不同的东西(突出显示的区域是麻烦的部分)。

以下是code

from tkinter import *
root = Tk()

weather_root = Frame(root,width=1000, height=5, bg = 'white')
weather_root.pack(side=TOP)

quote_root = Frame(root,width=1000, height =5, bg = 'white')
quote_root.pack(side=TOP)

news_root = Frame(root,width=1000, height =100, bg = 'white')
news_root.pack(side=TOP,  fill= BOTH)

financial_root= Frame(root,width=1000, height =100, bg = 'white')
financial_root.pack(side=TOP,  fill= BOTH)

# PROBLEM BOX
time_root = Frame(root, bg = 'yellow')
time_root.pack(side = RIGHT,  fill= BOTH)

我仍然很陌生,所以我确定它显而易见,但它是什么? (在图片中我把它拆分为两帧 - 这是最终目标,但在短期内,我只是试图让帧显示在当前放置的帧的右侧) 。非常感谢!

预期产出:

enter image description here

实际输出:

enter image description here

2 个答案:

答案 0 :(得分:1)

完成所需输出的最简单方法是创建两个单独的子帧。您可以将天气,报价,新闻和财务根帧打包到左侧子帧中,然后将时间帧打包到右侧子帧中。最后,你将它们打包到root中,一个使用SIDE = LEFT,另一个使用SIDE = RIGHT。此外,可以在一个应用程序中有效地使用Grid和Pack,但是一次只能使用一个布局管理器(grid vs pack)管理一个单独的窗口小部件(例如框架)。因此,您可以将框架等网格小部件网格化为一个框架,然后将该框架打包到另一个框架中。或者,您可以将东西打包到子框架中,然后将其网格化到窗口的主框架中。

答案 1 :(得分:1)

pack几何管理器不适合在网格中布局。不出所料,grid是更好的选择。除非您专门添加其他框架以帮助布局,否则使用pack执行所需操作将非常困难。

使用grid执行此操作非常简单。它看起来像这样:

weather_root.grid(  row=0, column=0, sticky="nsew")
quote_root.grid(    row=1, column=0, sticky="nsew")
news_root.grid(     row=2, column=0, sticky="nsew")
financial_root.grid(row=3, column=0, sticky="nsew")
time_root.grid(     row=0, column=1, sticky="nsew", rowspan=4)

您还需要使用root.grid_rowconfigureroot.grid_columnconfigure将权重应用于调整窗口大小时应增长或缩小的行和列。

如果您想使用pack,我建议您添加两个额外的框架:一个用于左侧(灰色),另一个用于右侧(黄色)。你可以使用pack来表示这两个。然后,在左侧,您可以使用pack从上到下堆叠区域。在您的具体情况下,这是否是正确的解决方案,我不知道。

注意:

  1. 我强烈建议您以这种方式对来电gridpack进行分组。当它们全部在一个位置而不是与其他代码交错时,它的很多更容易管理。

  2. 我不建议在示例中使用额外的空格作为showin。我这样做只是为了让您更容易看到行和列的关系。

  3. 有关pack工作原理的规范说明,请参阅http://tcl.tk/man/tcl8.5/TkCmd/pack.htm#M26