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稍后出现的小部件。

4

2 回答 2

10

正如马特所指出的,这完全与堆叠顺序有关。堆叠顺序只是应用程序中小部件的“z 坐标”——你可以把它想象成除了屏幕上的自然 x 和 y 坐标之外,还有另一个垂直于平面的轴屏幕。所有小部件都位于该轴的某个位置。您在屏幕上实际看到的图像是沿该轴将所有小部件“展平”在一起的结果。小部件在 x 和 y 平面上重叠的任何地方,在堆叠顺序中较高的小部件就是您在该位置看到的。

Tk 中小部件的默认堆叠顺序由它们的创建顺序决定。它创建的小部件越早,它在堆叠顺序中的位置就越低——想象一下屏幕本身的 z 坐标为零,从屏幕向您靠近的值越来越多。创建的第一个小部件的堆叠顺序为零,第二个有一个,依此类推。

解决您的问题的最简单方法就是按正确的顺序创建小部件,但如果您不按所示顺序创建小部件,您可以稍后手动更改堆叠顺序,以确保小部件堆叠按照你想要的顺序。例如,要将蓝色框架再次置于顶部,您可以添加:

raise .top .root

这告诉 Tk 更改 的堆叠顺序.top,使其位于 "above" .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对我来说,这使得and.root.top和之间的关系变得.root.bot清晰:两个框架位于窗格窗口的“内部”。自然的堆叠顺序恰好是正确的,每个人都很高兴。

于 2009-08-11T07:07:06.343 回答
3

哇,我已经有一段时间没有想到 Tcl/Tk 了。感谢您的记忆之旅。:)

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

希望这可以帮助。

于 2009-08-11T06:29:16.683 回答