我正在创建一小段GUI,它必须完成流程的进展。我想要的是创建一个创建GUI的proc,并在GUI关闭时返回1或0,然后流程继续,如下所示:
first part of the code
...
...
if {![open_gui]} {
return
}
second part of the code
...
...
GUI是简单的3个条目,带有保存和取消按钮,如果按下保存按钮,则应将一些值存储到数据模型中,并且如果按下取消按钮,则返回1的功能,或GUI通过关闭窗口关闭然后什么也不会发生,并且proc返回0。
这可能吗?
现在我所做的就是将代码分成两个和平,(code_part_1
和code_part_2
)我运行第一部分,然后打开GUI,保存按钮调用第二部分,取消只是关闭GUI:
code_part_1
open_gui_split
函数open_gui_split
是:
proc open_gui_split {} {
# ...
set save_b [button $win.save_b -text save -command [list code_part_2]
# ...
}
* - 所有呈现的代码仅代表架构而非真实代码。
答案 0 :(得分:2)
完全可以创建运行Tk GUI的命令,等待用户的响应并返回该值。这样做的关键是tkwait
命令:
proc popUpButton {w} {
toplevel $w
pack [button $w.b -text "push me" -command [list destroy $w]]
# This waits in the event loop until $w is destroyed...
tkwait window $w
return "button was pushed"
}
puts "about to pop up the button"
puts ">>[popUpButton]<<"
puts "popped up the button"
tkwait
有三种类型:
tkwait window $w
等待窗口$w
被销毁。tkwait visibility $w
等待窗口$w
变为可见(但在Unix / X11以外的平台上不起作用)。tkwait variable $varname
等待设置变量$varname
;它就像普通的Tcl vwait
(实际上vwait
在将事件循环集成到Tcl之前原来是tkwait variable
。请注意,重新进入事件循环会增加堆栈深度,如果您不小心,可能会导致代码混乱。您可能希望使用focus
和grab
来确保用户只与弹出的对话框进行交互。
最后,要查看更完整的示例,了解这一切是如何工作的,请查看source to tk_dialog
(这正是Tk 8.4.19中的版本,直接来自我们的存储库),这只是普通的旧Tcl代码,并且你所追求的那种东西。这是一个比我想写的更完整的例子,展示了如何根据用户输入获得返回值的事情。