代码之家  ›  专栏  ›  技术社区  ›  Daniel Yankowsky

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

  •  1
  • Daniel Yankowsky  · 技术社区  · 15 年前

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

    但是,当我移动 泛窗 命令停止,事情停止工作。顶部蓝色框未显示。相反,红色的 泛窗 自身闪耀:

    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
    

    为什么会这样?可以一 泛窗 真的只管理在它之后创建的小部件吗?我见过打包机的类似行为,它会拒绝打包小部件。 -in 稍后提供的小工具。

    2 回复  |  直到 15 年前
        1
  •  10
  •   Eric Melski    15 年前

    正如马特所指出的,这一切都与堆放顺序有关。堆叠顺序只是应用程序中小部件的“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.top .root.bot 清除:这两个框架在窗格窗口的“内部”。自然的堆放顺序恰好是正确的,每个人都很高兴。

        2
  •  3
  •   Matt Davis    15 年前

    哇,我已经有一段时间没想到TCL/TK了。谢谢你的记忆之旅。:)

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

    希望这有帮助。