为什么小部件的创建顺序很重要?

时间:2009-08-11 05:42:15

标签: tcl tk

以下代码正常。它显示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小部件。

2 个答案:

答案 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)

哇,已经有一段时间了,因为我甚至想过Tcl / Tk。感谢记忆之旅。 :)

根据此link,兄弟窗口小部件的默认堆叠顺序是它们的创建顺序,而不是它们的打包顺序。从本质上讲,.top,.bot和.root都是彼此的兄弟姐妹,因为它们在小部件层次结构中处于同一级别,即它们都“悬挂”在同一个父级(在这种情况下为“。”)。我希望如果你将panedwindow命令向下移动一行,你也不会看到绿色框。我想如果你分别将.top和.bot重命名为.root.top和.root.bot,这可能会解决你所看到的问题,因为这会使他们成为.root父级的孩子。

希望这有帮助。