1

我正在创建一小块 GUI,这是流程进展所必须完成的。我想要的是创建一个 proc,它创建一个 GUI,并在 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]
    # ...
}

* - 提供的所有代码只是架构的表示,而不是真正的代码。

4

1 回答 1

3

完全可以创建运行 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 最初是tkwait variable将事件循环集成到 Tcl 之前)。

请注意,重新进入事件循环会增加堆栈深度,如果您不小心,可能会导致您的代码变得非常混乱。您可能希望使用focusgrab确保用户只与弹出的对话框交互。

最后,要查看有关这一切如何工作的更完整示例,请查看源代码tk_dialog(这正是 Tk 8.4.19 的版本,直接来自我们的存储库),它只是普通的旧 Tcl 代码,可以做你想做的事情'重新之后。这是一个比我想写的更完整的示例,展示了诸如如何根据用户输入获取要返回的值之类的东西。

于 2013-03-06T10:36:58.220 回答