我有一个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
}
答案 0 :(得分:3)
一种方法是只使用tkwait window $yourwindow
等待用户关闭窗口。窗口本身应该使用客户端代码传递给它的一些变量来管理用户输入。例如,如果您需要用户输入数据库名称,请使用entry
窗口小部件并使用其-textvariable
选项将其绑定到变量。窗口关闭后,客户端代码中的tkwait
返回,请读取该变量的值。
另一种方法是不使用模态窗口并转换为事件驱动的控制流程。也就是说,让你的查询窗口接收一个程序的名称,该程序在用户接受其输入时应该被调用(并且该输入被验证)并在那里进行任何进一步的处理而不是发布窗口并等待用户处理它