我需要 select 在 tk_menuOption 和调用 um 事件后的选项

I am need select a option at the tk_menuOption and after invoke um event

我想要的是它触发绑定到每个选择的事件。

所以我不会使用按钮来调用任何事件。

这是我的疑惑:

set choice [list \
{News} \
{Nature} \
{City} \
{Food} \
{People} \
{Anime} \
{Tecnology} \
{Objects} \
{Others}]

tk_optionMenu . chose {*}$choice

bind . <1> { 
    clipboard clear
    clipboard append [%W cget -text]
    bell
    # Procedure to be invoke, this bellow:
    load
}
   
proc load { } {
   # Code here!
   tk_messageBox -message "You picked the option: $chose"
}

我如何才能为 tk_optionMenu 绑定一些事件,因为我可以先更改每个选项,以便在调用过程之后。

bind . <1>一样,没有时间选择。然后,通过点击 tk_menuOption.

触发

我什至尝试切换到 bind 本身的其他属性,但我没有得到预期的结果。

我认为缺少一些东西才能使其按照问题中的建议工作。我认为它一定是一个秒表,在调用事件之前等待几毫秒。这就是我的想象。

首先,tk_optionMenu 只是一个过程。 这里是 the source for it,但它真的很短:

proc ::tk_optionMenu {w varName firstValue args} {
    upvar #0 $varName var

    if {![info exists var]} {
        set var $firstValue
    }
    menubutton $w -textvariable $varName -indicatoron 1 -menu $w.menu \
            -relief raised -highlightthickness 1 -anchor c \
            -direction flush
    menu $w.menu -tearoff 0
    $w.menu add radiobutton -label $firstValue -variable $varName
    foreach i $args {
        $w.menu add radiobutton -label $i -variable $varName
    }
    return $w.menu
}

如果不是你想要的,就拿代码修改吧

其次,菜单上的事件真的很棘手!特别是,如果您使用的是 Windows 或 macOS,那么由于其本机菜单系统的工作方式,许多标准事件根本不会传送。相反,您会得到 two possible, useful callbacks:

  1. 菜单项的-command回调;大多数菜单项都支持这一点,尤其是包括所有结束与菜单交互会话的菜单项(例如 command 项和 radiobutton 项)。
  2. 整个菜单的 -postcommand 回调,当菜单发布到屏幕时调用,让您有机会动态更改菜单的内容(如果需要)。

如果你想要的东西不能用这些来完成,那么它可能首先不应该用菜单来完成,因为与菜单的交互模式是非常固定的。 A listbox 可能更合适?或者一些自定义的东西(你通常可以用 textcanvas 做那些;不需要 C)。

虽然 tk_menuOption 不提供选择选项时的绑定,但它有一个关联变量。所以你可以跟踪那个变量并在处理程序中做任何你想做的事情:

trace add variable chose write {apply {{name arg op} {
    upvar 1 $name var
    clipboard clear
    clipboard append $var
    bell
    # Procedure to be invoked
    load
}}}

注意:覆盖内置命令不是一个好主意,比如load。它很可能会破坏很多东西。

尽管我们已经有了解决此问题的良好解决方案的答案。

在我收到答案之前,每个人都找到了这个 link - https://wiki.tcl-lang.org/page/tk_optionMenu

link中的“snippet”描述如下:

tk_optionMenu $w varName a b c d 
for {set i 0} {$i < [[$w cget -menu] index end]} {incr i} {
    [$w cget -menu] entryconfig $i -command $cmd 
}

那是解决我的问题的答案的发现。所以,我想分享给朋友们:

我的例子:

#!/bin/sh
# \
exec wish "[=11=]" "$@"

package require Tk

. configure -width 300 -height 200

set choice [list \
{News} \
{Nature} \
{City} \
{Food} \
{People} \
{Anime} \
{Tecnology} \
{Objects} \
{Others} ]

tk_optionMenu .foo chose {*}$choice

for {set i 0} {$i < [[.foo cget -menu] index end]} {incr i} {
    [.foo cget -menu] entryconfig $i -command {load;bell}
}
   
proc load { } {
global chose
    # Code here!
    tk_messageBox -message "You picked the option: $chose"
}

pack .foo -side left -fill both -expand 1
.foo config -indicatoron 0 -relief flat -justify center -bg white

打印:

但是,他们给出的答案.. and ,帮了大忙。现在我学到了更多以前不知道的东西。由于单词 load 嵌入在 Tcl 中,因此使用它们不是一个好主意。