如何解决我需要在 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:
- 菜单项上的
-command
回调;大多数菜单项都支持这一点,特别是包括所有结束与菜单交互会话的菜单项(例如command
项和radiobutton
项)。 - 整个菜单上的
-postcommand
回调,在菜单发布到屏幕时调用,让您有机会动态更改菜单内容(如果需要)。
如果你想要的东西不能用这些来完成,那么它可能不应该首先用菜单来完成,因为与菜单的交互模式是非常固定的。 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
)不是一个好主意。很可能会破坏很多东西。
即使我们已经有了解决这个问题的好解决方案的答案。
在我收到答案之前,每个人都找到了这个链接 - 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
打印:
但是,他们给出的答案 .. Schelte Bron 和 Donal Fellows 帮助很大。现在我学到了更多以前不知道的东西。由于单词 load
嵌入在 Tcl 中,因此使用它们不是一个好主意。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。