将文本写入tcl/tk对话框中的输入字段

问题描述:

在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' ...) –

我猜你已经上了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”,您可以停止焦点位于条目中时触发对话框级别的绑定。 –

好吧,我没有想到我的快捷键,我也在那个脚本中。无论何时将这些字母中的一个写入输入字段,窗口都会关闭。我对键进行组合像...

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