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

Tcl 为什么小部件的创建顺序很重要?,tcl,tk,Tcl,Tk,下面的代码工作正常。它显示一个窗格窗口,顶部有一个蓝色框,下面有一个绿色框: 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 t

下面的代码工作正常。它显示一个
窗格窗口
,顶部有一个蓝色框,下面有一个绿色框:

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
真的只能管理在它之后创建的小部件吗?我在packer中也看到过类似的行为,它会拒绝在以后出现的小部件中打包小部件。

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

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


希望这能有所帮助。

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

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


希望这能有所帮助。

正如马特所说,这与堆叠顺序有关。堆叠顺序只是应用程序中小部件的“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
之间的关系变得清晰:这两个框架“在”窗格窗口中。自然的堆叠顺序恰好是正确的,每个人都很高兴。

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

Tk中小部件的默认堆叠顺序由其创建顺序决定。它创建的小部件越早,堆叠顺序就越低——想象一下屏幕本身处于z坐标零,屏幕上的值越来越大。创建的第一个小部件的堆叠顺序为零,第二个小部件的堆叠顺序为一,以此类推

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

raise .top .root
这告诉Tk更改
.top
的堆叠顺序,使其位于
.root
之上

当我使用窗格窗口小部件时,我倾向于让它管理子窗口小部件-对我来说,它在概念上只是一个具有额外行为的框架,因为我使用框架将相关的小部件组合在一起,所以我使用窗格窗口的方式是相同的。这一政策还巧妙地回避了堆叠问题