是否可以创建一个使用Tcl返回值的GUI?

时间:2013-03-06 09:52:57

标签: tcl tk

我正在创建一小段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_1code_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]
    # ...
}

* - 所有呈现的代码仅代表架构而非真实代码。

1 个答案:

答案 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有三种类型:

  1. tkwait window $w等待窗口$w被销毁。
  2. tkwait visibility $w等待窗口$w变为可见(但在Unix / X11以外的平台上不起作用)。
  3. tkwait variable $varname等待设置变量$varname;它就像普通的Tcl vwait(实际上vwait 在将事件循环集成到Tcl之前原来是tkwait variable
  4. 请注意,重新进入事件循环会增加堆栈深度,如果您不小心,可能会导致代码混乱。您可能希望使用focusgrab来确保用户只与弹出的对话框进行交互。

    最后,要查看更完整的示例,了解这一切是如何工作的,请查看source to tk_dialog(这正是Tk 8.4.19中的版本,直接来自我们的存储库),这只是普通的旧Tcl代码,并且你所追求的那种东西。这是一个比我想写的更完整的例子,展示了如何根据用户输入获得返回值的事情。