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

Writing text into entry field in tcl/tk dialog

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

问题:
每当用户在输入字段中写入一个字母时,对话框会立即关闭。

好的,我没有考虑我的快捷键,我在那个脚本中也有。每当将其中一个字母写入输入字段时,window 就会关闭。我必须像 ...

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

我猜你在 TestValue 变量(可能是由于 vwaittkwait variable)的其他地方得到了跟踪,它正在检测变量的变化并且destroy在发生这种情况时打开小部件,可能是通过终止整个对话框。您没有包含代码,但它可能类似于:

proc make-me-a-dialog {} {
    toplevel .dialog_TC
    # ...
    add_entry { something ... }
    # ...
    vwait TestValue
    destroy .dialog_TC
    return $TestValue
}

这是一个猜测,而且可能也大大简化了。但如果是这种情况,第一个更改变量值的事件(即条目中 most 按键)将导致 vwait 停止等待并触发毁灭级联。

您需要停止等待条目的内容。您不想在每次更改内容时触发,而是仅在用户说“我完成并想要进行更改,OK”或“我完成但不执行”时触发想要进行更改,Cancel”。或者,根据交互方式,“我完成了;我的更改已经生效。关闭此 window”。凭借丰富的经验,您 实际上 需要监听的事件是 window 的关闭、Return[ 的按下=33=] 并按下 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
    }
}