Tcl/Tk 8.6.11中<<MenuSelect>>事件在tearoff菜单下不触发问题咨询
Tcl/Tk 8.6.11+ 版本tearoff菜单<>事件不触发解决方案
问题根因
Tk 从8.6.10版本开始重构了tearoff菜单的实现逻辑:菜单触发tearoff后,不会再复用原菜单实例,而是生成一个独立顶层窗口托管的克隆菜单实例,原菜单上绑定的<
兼容高版本的解决方案
以下方案均不需要大幅修改原有业务代码,可直接适配8.6.11/12、8.7等高版本:
方案1:绑定到菜单全局类(改动最小)
直接将<
# 把原来的 bind $w <<MenuSelect>> ... 替换成下面这行 bind Menu <<MenuSelect>> [list ::somehandler $w %W]
如果需要避免影响其他无关菜单,可以在处理函数::somehandler中增加判断逻辑,仅处理符合路径规则/属性的菜单即可,原有业务逻辑不需要做任何调整。
方案2:监听tearoff事件动态绑定
如果不想对全局菜单类做绑定,可以监听原菜单的<
# 在原有绑定代码后新增这一行即可 bind $w <<Tearoff>> {bind %W <<MenuSelect>> [list ::somehandler $w %W]}
这个方案的影响范围仅局限于你当前使用的菜单及其生成的tearoff实例,不会干扰其他业务模块的菜单逻辑。
内容的提问来源于stack exchange,提问作者Alex P
相关产品推荐
相关产品推荐

