我需要 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:
- 菜单项的
-command
回调;大多数菜单项都支持这一点,尤其是包括所有结束与菜单交互会话的菜单项(例如 command
项和 radiobutton
项)。
- 整个菜单的
-postcommand
回调,当菜单发布到屏幕时调用,让您有机会动态更改菜单的内容(如果需要)。
如果你想要的东西不能用这些来完成,那么它可能首先不应该用菜单来完成,因为与菜单的交互模式是非常固定的。 A listbox
可能更合适?或者一些自定义的东西(你通常可以用 text
或 canvas
做那些;不需要 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 中,因此使用它们不是一个好主意。
我想要的是它触发绑定到每个选择的事件。
所以我不会使用按钮来调用任何事件。
这是我的疑惑:
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:
- 菜单项的
-command
回调;大多数菜单项都支持这一点,尤其是包括所有结束与菜单交互会话的菜单项(例如command
项和radiobutton
项)。 - 整个菜单的
-postcommand
回调,当菜单发布到屏幕时调用,让您有机会动态更改菜单的内容(如果需要)。
如果你想要的东西不能用这些来完成,那么它可能首先不应该用菜单来完成,因为与菜单的交互模式是非常固定的。 A listbox
可能更合适?或者一些自定义的东西(你通常可以用 text
或 canvas
做那些;不需要 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
打印:
但是,他们给出的答案.. load
嵌入在 Tcl 中,因此使用它们不是一个好主意。