如何在Tcl / Tk中关闭时返回窗口值

时间:2011-11-24 16:47:00

标签: variables tcl tk tkentry

我有一个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

}

1 个答案:

答案 0 :(得分:3)

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

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

相关的手册页为:tkwaitoptions(适用于-textvariable)。