1

我有一个proc创建一个新窗口,要求用户提供数据库名称。我想要这个函数,在它关闭后返回一个值。

如何创建一个窗口以将一个值返回给它正在调用的 proc?我尝试使用以下方法调用它:

puts "dbug:: [set top [new_db_window]]"

puts就是看结果。它不起作用。在创建窗口时打印一个空字符串(“ ”),当我点击“确定”按钮时打印一个dbug::错误“ ”。can't read "::new_db_window": no such variable

proc的代码是:

proc new_db_window {} {

    toplevel .new_db_menu


    wm title .new_db_menu "New Data Base"

    # Main Frame
    frame       .new_db_menu.frm -relief "groove" -bd 2
    grid        .new_db_menu.frm

    if {[info exists db_name]} {
        unset db_name
    }
    set ::new_db_window:db_name "Data_Base"

    # The Name Entry
    set frm_top [frame  .new_db_menu.frm.top]
    set lbl     [label  .new_db_menu.frm.top.label  -text "Database Name:" -width 15]
    set entr    [entry  .new_db_menu.frm.top.entry  -textvariable ::new_db_window:db_name -width 15]

    # The buttons
    set b_ok    [button .new_db_menu.frm.ok     -image icon_v   -command {return [new_db_ok_button]}]
    set b_no    [button .new_db_menu.frm.cancel -image icon_x   -command {new_db_cancel_button}]
    set sep_w   [label  .new_db_menu.frm.sep_w  -text ""        -width 1]
    set sep_e   [label  .new_db_menu.frm.sep_e  -text ""        -width 1]


    grid $lbl       -row 1  -column 1   -sticky w
    grid $entr      -row 1  -column 2   -sticky w
    grid $frm_top   -row 1  -column 1   -columnspan 4
    grid $sep_w     -row 2  -column 1   -sticky w
    grid $b_ok      -row 2  -column 2   -sticky w
    grid $b_no      -row 2  -column 3   -sticky e
    grid $sep_e     -row 2  -column 4   -sticky e



    bind    .new_db_menu    <Key-KP_Enter>  {return [new_db_ok_button]}
    bind    .new_db_menu    <Return>        {return [new_db_ok_button]}
    bind    .new_db_menu    <Escape>        {new_db_cancel_button}

    # catch presses on the window's `x` button
        wm protocol .new_db_menu WM_DELETE_WINDOW {
        new_db_cancel_button
    }

    # make the top window unusable
    focus $entr
    grab release .
    grab set .new_db_menu


}

proc new_db_ok_button {} {
    new_db_cancel_button
    return "$::new_db_window:db_name"
}
proc new_db_cancel_button {} {
    grab set .
    destroy .new_db_menu

}
4

1 回答 1

3

一种方法是只使用tkwait window $yourwindow等待用户关闭窗口。窗口本身可能应该使用客户端代码传递给它的一些变量来管理用户输入。例如,如果您需要用户输入数据库名称,请使用小部件并使用其选项entry将其绑定到变量。-textvariable窗口关闭后,tkwait在客户端代码返回时,读取该变量的值。

另一种方法是不使用模态窗口并变成事件驱动的控制流。也就是说,让您的查询窗口接收在用户接受其输入(并且该输入已验证)时应调用的过程的名称并在那里进行任何进一步的处理,而不是发布一个窗口并等待用户处理它.

相关的手册页是:tkwaitoptions (for -textvariable)。

于 2011-11-24T17:38:52.237 回答