2016-09-21 6 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 переменной (возможно, из-за 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 
    } 
} 
+0

У меня есть несколько коротких клавиш для нескольких задач. При их реализации я не думал о полях, где мне нужно вводить текст. Сочетание букв с или будет работать. – Stingray

+1

Вы можете остановить привязки диалогового уровня от стрельбы, когда фокус находится в записи, помещая 'break' в конец скрипта привязки на уровне отдельного виджета. –

0

Хорошо, я не думал о своих коротких ключах, что у меня есть и в этом скрипте. Всякий раз, когда одна из этих букв записывается в поле ввода, окно закрывается. Я должен объединить ключи, как ...

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