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

Dan*_*sky 1 tk-toolkit tcl

以下代码工作正常.它显示一个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
Run Code Online (Sandbox Code Playgroud)

但是,当我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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?可以将panedwindow真的只管理后创建的小部件?我已经看到了与打包器类似的行为,它将拒绝打包-in稍后出现的小部件小部件.

Eri*_*ski 10

正如Matt所说,这与堆叠订单有关.堆叠顺序只是应用程序中小部件的"z坐标" - 您可以将其视为除了屏幕上的自然x和y坐标之外,还有另一个垂直于平面的轴.屏幕.所有小部件都沿着这个轴放置.您实际在屏幕上看到的图像是沿着该轴"展平"所有小部件的结果.窗口小部件在x和y平面中重叠的任何位置,堆叠顺序中较高的窗口小部件就是您在该位置看到的窗口小部件.

Tk中窗口小部件的默认堆叠顺序由其创建顺序决定.它创建的小部件越早,它在堆叠顺序中越低 - 想象屏幕本身在z坐标为零,并且屏幕上的值越来越大.创建的第一个窗口小部件的堆叠顺序为零,第二个窗口小部件有一个

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

raise .top .root
Run Code Online (Sandbox Code Playgroud)

这告诉Tk改变堆叠顺序.top,使其"高于" .root.

当我使用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
Run Code Online (Sandbox Code Playgroud)

对我来说,这使得之间的关系.root,并.root.top.root.bot明确:两个框架是"内部"分栏窗口.自然堆叠顺序恰好是正确的,每个人都很开心.