Я предполагаю, что у вас есть след в другом месте на 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
". Или, в зависимости от стиля взаимодействия, «я закончил; мои изменения уже живы. Закройте это окно ". С большим опытом, события, которые вы делаете на самом деле, нужно прислушаться к закрытию окна, нажатие Возврат и печать 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
}
}
В вашем примере у меня нет проблемы, о которой вы упоминаете. Поскольку вам нужен диалог, вы должны использовать tk_dialog или tk_messageBox? – b2vincent
Это странно. Я только что создал новый диалог только с рамкой и записью. В новом диалоговом окне у меня также нет этой проблемы. Когда я комментирую большую часть моего полного скрипта, кроме фрейма и поля ввода, также нет проблем. Я полагаю, что есть проблема с короткими ключами, которые я реализовал. – Stingray
Вы включаете только код для настройки, а не код для ответа на ввод. _Как написано, _ он не будет делать ничего похожего на то, что вы описываете (и ему нечего использовать '$ command' тоже ...) –