微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我需要在 tk_menuOption 和调用 um 事件之后选择一个选项

如何解决我需要在 tk_menuOption 和调用 um 事件之后选择一个选项

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

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

这是我的疑问:

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 回调,在菜单发布到屏幕时调用,让您有机会动态更改菜单内容(如果需要)。

如果你想要的东西不能用这些来完成,那么它可能不应该首先用菜单来完成,因为与菜单的交互模式是非常固定的。 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)不是一个好主意。很可能会破坏很多东西。

,

即使我们已经有了解决这个问题的好解决方案的答案。

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

链接中“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 "$0" "$@"

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

打印:

enter image description here

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。