结合网格/包Tkinter

use*_*063 5 python tkinter ttk

我知道过去网格和包装上有很多问题,但我只是不明白如何将两者结合起来,因为我在两个方向(行/列)上扩展我的'表'时遇到了困难.

按钮我希望保持相同的尺寸,但始终保持在窗口的底部.然而,我希望通过调整窗口大小自动扩展"表格",但似乎无法使其正常工作.将'win1'改为打包工作的意义在于它保持中心但就是这样.

我怎么能达到相同的效果,如粘贴等包装,因为我知道我需要更改术语.

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

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")
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 15

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

win1.pack(side="top", fill="both", expand=True)
Run Code Online (Sandbox Code Playgroud)

当您调整窗口大小时,这将导致此框架正确扩展和缩小.

第二个问题是你给的win是权重为1的第0行,但你frame_table输入的第3行的默认权重为0.我不知道这是否是有意的,但这就是保留标签的原因并且条目小部件粘在屏幕的底部,因为空行0 win1正在扩展和缩小以占用额外的空间.

如何学习布置你的小部件

适当的调整大小行为很容易实现,但要学会如何正确实现它是相当困难的.我的建议是,拿一些纸和一支铅笔.绘制应用程序的主要区域 - 每个区域具有不同的属性.例如,沿底部的一行应该保持在底部(状态栏或按钮行).也许顶部的东西(例如工具栏)应该保持在顶部等.通常只有一个区域是可扩展的,尽管可扩展区域本身可以分成两个或更多个区域.

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

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

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

这很简单,但需要有条不紊的方法.只是将一堆小部件扔进一个框架并尝试随机的东西让它工作并不是正确的方法.要有条不紊,将您的设计布置在纸上,转移到具有不同颜色的框架,然后添加您真实的小部件并添加最终的抛光.