将文本写入tcl/tk对话框中的输入字段
在tcl/tk对话框中,我需要从用户那里获取文本输入。将文本写入tcl/tk对话框中的输入字段
proc add_entry { command } {
global TestValue
entry .dialog_TC.enText -textvariable TestValue
grid .dialog_TC.enText -row 1 -column 1 -columnspan 2 -pady 1 -padx 1
}
问题:
当用户写了一个字母,进入入口域,对话框被立即关闭。
我猜你已经上了TestValue
变量(可能是由于vwait
或tkwait variable
)其它地方的跟踪时会检测到变化的变量和destroy
当发生这种情况时可能会通过杀死整个对话框。您不包括代码,但它可能类似于:
proc make-me-a-dialog {} {
toplevel .dialog_TC
# ...
add_entry { something ... }
# ...
vwait TestValue
destroy .dialog_TC
return $TestValue
}
这是一个猜测,也可能大大简化。但是,如果是这种情况,首先要更改变量中的值(即条目中的大多数按键)将导致vwait
停止等待并触发级联销毁。
您需要停止等待条目的内容。你不想在每次改变内容时触发,而只是当用户说“我已经完成并想要进行修改,OK
”或“我完成了,不想让我的更改,Cancel
“。或者,根据互动风格,“我完成了;我的更改已经生效。关闭此窗口“。凭借丰富的经验,您所遇到的事件实际上需要听取的是关闭窗口,按返回并按转义。
让我们来修复。
proc make-me-a-dialog {}
global waiting
toplevel .dialog_TC
# ...
add_entry { something ... }
# ...
set dlg .dialog_TC
bind $dlg <Return> [list set waiting($dlg) 1]
bind $dlg <Escape> [list set waiting($dlg) 0]
# Trapping a window manager message; slightly different to normal events for historical reasons
wm protocol $dlg WM_DELETE_WINDOW [list set waiting($dlg) 0]
vwait waiting($dlg)
if {waiting($dlg)} {
return $ValueIndicatingOK
} else {
return $ValueIndicatingCancel
}
}
我有几个快捷键用于几个任务。在实施它们时,我没有想到需要输入文本的字段。将字母与
通过在单个窗口小部件级别的绑定脚本的末尾放置一个“break”,您可以停止焦点位于条目中时触发对话框级别的绑定。 –
好吧,我没有想到我的快捷键,我也在那个脚本中。无论何时将这些字母中的一个写入输入字段,窗口都会关闭。我对键进行组合像...
bind . <Control-Key-a> \
{ tk_messageBox -message "You pressed Control+A" } ;#Control+a
用你的例子,我没有你提到的问题。因为你想要一个对话框,你应该使用一个tk_dialog或一个tk_messageBox? – b2vincent
这很奇怪。我只是用一个框架和一个条目做了一个新的对话。在新的对话框中,我也没有这个问题。当我将大部分完整的脚本注释掉,除了一个框架和一个输入字段外,也没有问题。我想,我实施的快捷键也存在问题。 – Stingray
您只包含用于设置的代码,而不是用于响应输入的代码。 _写道,_它不会像你描述的那样做任何事情(它也没有任何东西可以使用'$ command' ...) –