gpt4 book ai didi

python - Tkinter pack 方法混淆

转载 作者:太空宇宙 更新时间:2023-11-04 09:26:29 25 4
gpt4 key购买 nike

我不明白为什么包管理器不允许您在顶部打包的小部件下方左右打包。以下代码的预期输出是

 A
B
C D
E

但它只显示:

 A
B
C D
import tkinter as tk

root = tk.Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.state('zoomed')
root.geometry("%dx%d+0+0" % (w-15, h-75))
A = tk.LabelFrame(root,text='A', bd=2)
B = tk.LabelFrame(root,text='B', bd=2)
C = tk.LabelFrame(root,text='C', bd=2)
D = tk.LabelFrame(root,text='D', bd=2)
E = tk.LabelFrame(root,text='E', bd=2)

A.pack(fill=tk.BOTH, expand=tk.TRUE)
B.pack(fill=tk.BOTH, expand=tk.TRUE)
C.pack(side=tk.LEFT,fill=tk.BOTH, expand=tk.TRUE)
D.pack(side=tk.RIGHT,fill=tk.BOTH, expand=tk.TRUE)
E.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.TRUE)

root.mainloop()

最佳答案

简而言之,打包器并非旨在直接创建您要创建的布局。你可以做到,但它需要一些额外的框架。在这种您显然要尝试创建网格的特殊情况下,grid 可以说是更好的选择。

在解释为什么会这样之前,让我提出一个解决方案。创建另一个名为“CD”的框架,它将用于保存 CD。然后,您可以将 C 放在左边,将 D 放在右边,然后将此框架放在 B 下方。这就是您使用打包器实现预期结果的方式。

A = tk.LabelFrame(root,text='A', bd=2)
B = tk.LabelFrame(root,text='B', bd=2)
CD = tk.Frame(root)
C = tk.LabelFrame(CD,text='C', bd=2)
D = tk.LabelFrame(CD,text='D', bd=2)
E = tk.LabelFrame(root,text='E', bd=2)

C.pack(side=tk.LEFT,fill=tk.BOTH, expand=tk.TRUE)
D.pack(side=tk.RIGHT,fill=tk.BOTH, expand=tk.TRUE)

A.pack(fill=tk.BOTH, expand=tk.TRUE)
B.pack(fill=tk.BOTH, expand=tk.TRUE)
CD.pack(fill=tk.BOTH, expand=tk.TRUE)
E.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.TRUE)

打包器解释

打包器通过在未分配空间的一侧保留一 block 空间来工作。 此分配空间在将小部件打包到顶部或底部时占据未分配空间的整个宽度,并在左侧或右侧打包时占据整个高度。这是一个重要的细节。

让我试着用一些截图来描述它。在所有情况下,以下屏幕截图不显示帧,它们显示加壳器管理的已分配和未分配空间量。

当您沿顶部打包A时(如果您未指定边,则默认为顶部),会为整个宽度保留一 block 空间根窗口。因为你把它打包到顶部,所以唯一剩余的空间在 A 下面。从此时起,A 的左侧或右侧不能再填充任何内容。

(实际上,您可以使用一些高级选项将东西放在左边或右边,但这超出了本说明的范围)

available space after A

当您将 B 沿顶部打包时,唯一可用的空间在 A 下面。同样,因为您将它打包在顶部,所以在打包 B 之后,现在唯一可用的可用空间将位于 B 下方。

available space after B

当您沿左侧打包 C 时,会为剩余空间的整个高度保留一 block 空间。这意味着 C 下不能放置任何内容。所有剩余空间都位于 C 的右侧和 B 的下方。

available space after C

  1. 打包D时,它必须位于C的右侧和B的下方。因为您将它打包到右侧,所以它会保留 D 上方和下方的所有剩余垂直空间。

available space after D

当你把 E 放在底部时,它唯一能去的地方是 B 下面,C 的右边,并且到D 的左边。

available space after E

由于打包器沿一侧分配所有空间的性质,当所有小部件都放置在同一轴上时,打包器的效果最好 - 垂直或水平堆叠。当您想像使用 CD 那样切换轴时,通常最好将它们放在单独的框架中。在该框架内,您可以从左到右放置小部件,但该框架可以像其他小部件一样保持在从上到下的轴上。

注意:这是您的代码中实际发生的情况:E 被挤压在 CD 之间。由于各种原因它不可见,但如果您给它一个明确的大小和颜色,它就会显示出来。

了解更多信息

加壳算法的权威描述可以在tcl/tk man pages for pack中找到.

关于python - Tkinter pack 方法混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57390278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com