Tcl 调用'时出现奇怪的结果;winfo children';使用菜单栏隐式生成顶级窗口
示例代码:Tcl 调用'时出现奇怪的结果;winfo children';使用菜单栏隐式生成顶级窗口,tcl,tk,Tcl,Tk,示例代码: package require Tk menu .mymenu . configure -menu .mymenu puts [winfo children .] 使用Tcl 8.6,这将打印出: .mymenu.#mymenu 我不知道#mymenu标识符来自哪里 请注意,在显式创建的顶级窗口上使用相同的代码时(因为是Tk中隐式生成的窗口),结果不同: package require Tk toplevel .win menu .win.mymenu . configur
package require Tk
menu .mymenu
. configure -menu .mymenu
puts [winfo children .]
使用Tcl 8.6,这将打印出:
.mymenu.#mymenu
我不知道#mymenu
标识符来自哪里
请注意,在显式创建的顶级窗口上使用相同的代码时(因为
是Tk中隐式生成的窗口),结果不同:
package require Tk
toplevel .win
menu .win.mymenu
. configure -menu .win.mymenu
puts [winfo children .win]
这张照片是:
.win.mymenu
这似乎是正确的行为。那么,为什么在第一个示例代码中隐式生成的窗口的结果不同呢?快速回答:菜单栏实际上是您指定菜单的一个克隆,并且该克隆具有那个奇怪的名称
出于我从未花时间完全理解的原因,菜单栏是从您指定的菜单中克隆出来的(使用
clone
方法-不要自己调用它!);我相信这与允许在多个窗口上放置相同的菜单和确保正确的嵌套层次结构有关,同样的机制也用于拆下的菜单(这是一种交互模式,现在已经不受欢迎了)。此克隆实际上与从中克隆的菜单共享其所有属性,但它是自己的小部件。克隆是使用从源菜单小部件派生的名称和克隆插入的顶级创建的。如果目标顶级是.foo.bar
,传递到-menu
选项的菜单是.grill.menu
,则克隆将是.foo.bar.#grill#menu
(菜单名称中的点变为.
字符);
附近的小部件名称构造通常有点特殊
建议您不要在菜单克隆机制中戳得太深。假装那些名字奇怪的小部件不存在。这几乎适用于所有情况(并且更易于跨平台移植;菜单机制在不同平台之间变化很大)。唯一的例外是,如果您正在根据菜单项显示工具提示/状态栏;执行该功能的自然方式(绑定到菜单)最终将克隆的名称传递到回调。解决这一问题并不难,但如果你在做这类事情,你需要小心。只需指出做
.win configure-menu.mymenu
打印出.win.mymenu.win.#mymenu
。非常好的信息,谢谢。实际上,我正在编写一个到Tk的语言绑定,我有一个将所有窗口小部件路径名映射到本机语言窗口小部件类对象实例的映射,但是我从我的部分得到了断言,因为我找不到这些对象的映射(因为它们不是从绑定本身创建的,而是您现在提到的这个内部克隆方法)!