为什么控件的创建顺序很重要?(Why is the creation order of widget

2019-09-22 23:45发布

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

Answer 1:

这一切都与堆叠顺序做,马特说。 堆叠顺序正好是“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明确:两个框架是“内部”分栏窗口。 自然堆叠顺序恰好是正确的,大家都高兴。



Answer 2:

哇,它已经有一段时间,我甚至想过的Tcl / Tk。 感谢您的一趟下来记忆里。 :)

根据这个链接 ,同级控件的默认堆叠顺序是在创建它们,而不是他们包装的次序顺序。 从本质上说,.TOP,.BOT和.root是相互的所有兄弟,因为他们是在小部件层次结构中的同一级别,即它们都(在这种情况下,“”)“挂”掉相同的父。 我希望如果移动panedwindow命令下来下一行,你不会看到绿色的盒子无论是。 我想,如果你要重命名.TOP和.BOT分别.root.top和.root.bot,这可能会解决你看到的,因为这将使他们.root父母的孩子的问题。

希望这可以帮助。



文章来源: Why is the creation order of widgets important?
标签: tcl tk