以下代码正常。它显示panedwindow
,顶部有一个蓝色框,下面是绿色框:
panedwindow .root -orient vertical -showhandle true -background red
frame .top -background blue -width 100 -height 100
frame .bot -background green -width 100 -height 100
.root add .top .bot
pack .root -expand true -fill both
但是,当我移动panedwindow
命令时,事情就会停止工作。顶部的蓝色框未显示。相反,panedwindow
本身的红色闪耀着:
frame .top -background blue -width 100 -height 100
panedwindow .root -orient vertical -showhandle true -background red
frame .bot -background green -width 100 -height 100
.root add .top .bot
pack .root -expand true -fill both
为什么会这样? panedwindow
真的只能管理之后创建的小部件吗?我已经看到了与打包器类似的行为,它将拒绝打包稍后出现的小部件-in
小部件。
答案 0 :(得分:10)
这与堆叠顺序有关,正如马特指出的那样。堆叠顺序只是应用程序中小部件的“z坐标” - 您可以将其视为除了屏幕上的自然x和y坐标之外,还有另一个垂直于平面的轴。屏幕。所有小部件都沿着这个轴放置。您实际在屏幕上看到的图像是沿着该轴“展平”所有小部件的结果。窗口小部件在x和y平面中重叠的任何位置,堆叠顺序中较高的窗口小部件就是您在该位置看到的内容。
Tk中窗口小部件的默认堆叠顺序由其创建顺序决定。它创建的小部件越早,它在堆叠顺序中越低 - 想象屏幕本身在z坐标为零,并且屏幕上的值越来越大。创建的第一个窗口小部件的堆叠顺序为零,第二个窗口小部件具有一个,等等。
解决问题的最简单方法就是按正确的顺序创建小部件,但是 如果您按照显示的顺序创建窗口小部件,则可以稍后手动更改堆叠顺序,以确保窗口小部件按所需顺序堆叠。例如,要将蓝框再次置于顶部,您可以添加:
raise .top .root
这告诉Tk更改.top
的堆叠顺序,使其“高于”.root
。
当我使用paned窗口小部件时,我倾向于让它管理子窗口小部件 - 对我而言,它在概念上只是一个具有额外行为的框架,并且因为我使用框架将相关的小部件组合在一起,所以我使用paned窗口同样的方式。此策略还巧妙地回避了堆叠顺序的问题,因为它要求您首先创建了paned窗口 - 您必须这样做,因为在创建窗口小部件之前,您无法创建窗口小部件的子窗口。因此,我会像这样修改你的例子:
panedwindow .root -orient vertical -showhandle true -background red
frame .root.top -background blue -width 100 -height 100
frame .root.bot -background green -width 100 -height 100
.root add .root.top .root.bot
对我来说,这会使.root
和.root.top
以及.root.bot
之间的关系变得清晰:两个框架位于窗格窗口的“内部”。自然堆叠顺序恰好是正确的,每个人都很开心。
答案 1 :(得分:3)
根据此link,兄弟窗口小部件的默认堆叠顺序是它们的创建顺序,而不是它们的打包顺序。从本质上讲,.top,.bot和.root都是彼此的兄弟姐妹,因为它们在小部件层次结构中处于同一级别,即它们都“悬挂”在同一个父级(在这种情况下为“。”)。我希望如果你将panedwindow命令向下移动一行,你也不会看到绿色框。我想如果你分别将.top和.bot重命名为.root.top和.root.bot,这可能会解决你所看到的问题,因为这会使他们成为.root父级的孩子。
希望这有帮助。