我猜你已經上了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
}
}
用你的例子,我沒有你提到的問題。因爲你想要一個對話框,你應該使用一個tk_dialog或一個tk_messageBox? – b2vincent
這很奇怪。我只是用一個框架和一個條目做了一個新的對話。在新的對話框中,我也沒有這個問題。當我將大部分完整的腳本註釋掉,除了一個框架和一個輸入字段外,也沒有問題。我想,我實施的快捷鍵也存在問題。 – Stingray
您只包含用於設置的代碼,而不是用於響應輸入的代碼。 _寫道,_它不會像你描述的那樣做任何事情(它也沒有任何東西可以使用'$ command' ...) –