2009-08-11 55 views
1

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

回答

10

正如Matt指出的那样,这与堆叠顺序有关。堆叠顺序只是您应用中小部件的“z坐标”,您可以将它看作是除了屏幕上自然的x和y坐标之外,还有另一个与垂直于屏幕。所有的小部件都在这个轴上。您在屏幕上实际看到的图像是沿着该轴“拼合”所有小部件的结果。在x和y平面上任何部件重叠的地方,堆叠顺序较高的部件就是您在该位置看到的部件。

Tk中窗口小部件的默认堆叠顺序由其创建顺序决定。它创建的窗口部件越早,其堆叠顺序为—的窗口越低,屏幕本身位于z坐标零点,屏幕上的值越来越大。第一个创建的小部件具有堆叠顺序零,第二个具有一个,等等。

解决问题的最简单方法就是按照正确的顺序创建小部件,但如果您在创建小部件时遇到问题,则可以使用 您已经显示的订单,您可以稍后手动更改堆叠顺序,以确保按您想要的顺序堆叠小部件。例如,再次把你的蓝框顶端,您可以添加:

raise .top .root 

这告诉Tk的改变.top堆叠顺序,以便它是“上面” .root

当我使用窗口窗口小部件时,我倾向于管理子窗口小部件—给我,它在概念上只是一个具有额外行为的框架,并且由于我使用框架将相关窗口小部件组合在一起,所以我使用窗口窗口一样的方法。此策略也巧妙地回避了堆叠顺序的问题,因为它要求您必须首先创建窗口窗口—,因为在创建窗口小部件之前,您无法创建窗口小部件的子窗口。因此,我会修改你的例子是这样的:

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明确的关系:两个框架是“内部”分栏窗口。自然的叠加顺序恰好是正确的,每个人都很高兴。

+0

现在看来很明显,我看着它。谢谢您的帮助! – 2009-08-11 13:30:41

3

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

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

希望这会有所帮助。

+0

感谢您的简洁,非常有用的回应!我刚刚开始使用Tcl/Tk,很高兴能从知道他们在做什么的人那里获得帮助。 – 2009-08-11 13:12:14

相关问题