在 tcl/tk 对话框中将文本写入输入字段
Writing text into entry field in tcl/tk dialog
在 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
}
问题:
每当用户在输入字段中写入一个字母时,对话框会立即关闭。
好的,我没有考虑我的快捷键,我在那个脚本中也有。每当将其中一个字母写入输入字段时,window 就会关闭。我必须像 ...
这样组合键
bind . <Control-Key-a> \
{ tk_messageBox -message "You pressed Control+A" } ;#Control+a
我猜你在 TestValue
变量(可能是由于 vwait
或 tkwait variable
)的其他地方得到了跟踪,它正在检测变量的变化并且destroy
在发生这种情况时打开小部件,可能是通过终止整个对话框。您没有包含代码,但它可能类似于:
proc make-me-a-dialog {} {
toplevel .dialog_TC
# ...
add_entry { something ... }
# ...
vwait TestValue
destroy .dialog_TC
return $TestValue
}
这是一个猜测,而且可能也大大简化了。但如果是这种情况,第一个更改变量值的事件(即条目中 most 按键)将导致 vwait
停止等待并触发毁灭级联。
您需要停止等待条目的内容。您不想在每次更改内容时触发,而是仅在用户说“我完成并想要进行更改,OK
”或“我完成但不执行”时触发想要进行更改,Cancel
”。或者,根据交互方式,“我完成了;我的更改已经生效。关闭此 window”。凭借丰富的经验,您 实际上 需要监听的事件是 window 的关闭、Return[ 的按下=33=] 并按下 Escape.
我们来解决。
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
}
}
在 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
}
问题:
每当用户在输入字段中写入一个字母时,对话框会立即关闭。
好的,我没有考虑我的快捷键,我在那个脚本中也有。每当将其中一个字母写入输入字段时,window 就会关闭。我必须像 ...
这样组合键bind . <Control-Key-a> \
{ tk_messageBox -message "You pressed Control+A" } ;#Control+a
我猜你在 TestValue
变量(可能是由于 vwait
或 tkwait variable
)的其他地方得到了跟踪,它正在检测变量的变化并且destroy
在发生这种情况时打开小部件,可能是通过终止整个对话框。您没有包含代码,但它可能类似于:
proc make-me-a-dialog {} {
toplevel .dialog_TC
# ...
add_entry { something ... }
# ...
vwait TestValue
destroy .dialog_TC
return $TestValue
}
这是一个猜测,而且可能也大大简化了。但如果是这种情况,第一个更改变量值的事件(即条目中 most 按键)将导致 vwait
停止等待并触发毁灭级联。
您需要停止等待条目的内容。您不想在每次更改内容时触发,而是仅在用户说“我完成并想要进行更改,OK
”或“我完成但不执行”时触发想要进行更改,Cancel
”。或者,根据交互方式,“我完成了;我的更改已经生效。关闭此 window”。凭借丰富的经验,您 实际上 需要监听的事件是 window 的关闭、Return[ 的按下=33=] 并按下 Escape.
我们来解决。
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
}
}