2013-08-17 76 views
2

示例代码调用“winfo孩子们在隐式生成顶层窗口时,奇怪的结果.#mymenu标识符来自哪里。与菜单栏

注意,使用相同的代码时的显式地创建顶层窗口上(因为.是在Tk的隐式生成的窗口),结果是不同的:

package require Tk 

toplevel .win 

menu .win.mymenu 
. configure -menu .win.mymenu 

puts [winfo children .win] 

此打印:

.win.mymenu

这似乎是正确的行为。那么为什么第一个示例代码中隐式生成窗口的结果会有所不同?

+0

只要指出'.win configure -menu .mymenu'输出'.win.mymenu .win。#mymenu'。 – Jerry

回答

3

快速回答:菜单栏实际上是您指定菜单的克隆,并且该克隆具有奇怪的名称。


至于原因,我从来没有采取完全理解的时候,菜单栏被克隆(与clone方法 - 从来没有调用自己!)关闭您指定的菜单;我相信这与允许将相同的菜单放置在多个窗口中并确保正确的嵌套层次结构有关,并且相同的机制也用于撕掉的菜单(这种互动范例在很大程度上已经失宠)。该克隆实际上与它克隆的菜单共享其所有属性,但它是它自己的小部件。这些克隆是使用派生自源菜单窗口小部件的名称和插入克隆的顶层进行创建的。如果目标顶层为.foo.bar,并且传递给-menu选项的菜单为.grill.menu,则该克隆将为.foo.bar.#grill#menu(菜单名称中的点变为#个字符);在.附近的构件名称构造通常稍微特别。

建议您不要在菜单克隆机制中打得太深。假装那些奇怪命名的小部件不存在。这几乎适用于所有情况(也是跨平台可移植性更强的平台,菜单机制也有很大差异)。唯一的例外是如果您正在基于菜单条目进行工具提示/状态栏显示;执行该功能的自然方式(绑定到菜单)最终将克隆的名称提供给您的回调。解决问题并不难,但如果你正在做这种事情,你需要小心。

+0

伟大的信息,谢谢。其实我正在编写一个绑定到Tk的语言,并且我有一个将所有小部件路径名映射到本机语言小部件类对象实例的映射,但是我从我的部分获取了断言,因为我找不到这些对象的映射(因为它们不是从绑定本身创建的,而是现在提到的这种内部克隆方法)。感谢您的领导! –