2016-09-21 432 views
0

在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  
} 

問題:
當用戶寫了一個字母,進入入口域,對話框被立即關閉。

+0

用你的例子,我沒有你提到的問題。因爲你想要一個對話框,你應該使用一個tk_dialog或一個tk_messageBox? – b2vincent

+0

這很奇怪。我只是用一個框架和一個條目做了一個新的對話。在新的對話框中,我也沒有這個問題。當我將大部分完整的腳本註釋掉,除了一個框架和一個輸入字段外,也沒有問題。我想,我實施的快捷鍵也存在問題。 – Stingray

+0

您只包含用於設置的代碼,而不是用於響應輸入的代碼。 _寫道,_它不會像你描述的那樣做任何事情(它也沒有任何東西可以使用'$ command' ...) –

回答

0

我猜你已經上了TestValue變量(可能是由於vwaittkwait 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 
    } 
} 
+0

我有幾個快捷鍵用於幾個任務。在實施它們時,我沒有想到需要輸入文本的字段。將字母與組合起來將起作用。 – Stingray

+1

通過在單個窗口小部件級別的綁定腳本的末尾放置一個「break」,您可以停止焦點位於條目中時觸發對話框級別的綁定。 –

0

好吧,我沒有想到我的快捷鍵,我也在那個腳本中。無論何時將這些字母中的一個寫入輸入字段,窗口都會關閉。我對鍵進行組合像...

bind . <Control-Key-a> \ 
{ tk_messageBox -message "You pressed Control+A" } ;#Control+a