【问题标题】:Is it possible to create a GUI that return a value with Tcl?是否可以创建一个使用 Tcl 返回值的 GUI?
【发布时间】:2013-03-07 04:58:08
【问题描述】:

我正在创建一小部分 GUI,这是流程进展所必须完成的。我想要的是创建一个创建 GUI 并在 GUI 关闭然后流程继续时返回 1 或 0 的 proc,如下所示:

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,保存按钮调用第二部分,而取消只是关闭图形用户界面:

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]
    # ...
}

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

【问题讨论】:

    标签: tcl tk


    【解决方案1】:

    完全可以创建运行 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)。

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

    最后,要查看有关这一切如何工作的更完整示例,请查看 source to tk_dialog(这正是 Tk 8.4.19 的版本,直接来自我们的存储库),它只是普通的旧 Tcl 代码,并进行了排序你追求的东西。这是一个比我想写的更完整的示例,展示了如何根据用户输入获取要返回的值。

    【讨论】:

    • 使用 Tcl 8.6 的协程可以理顺所有这些导致的代码混乱,但这是另一个更复杂的话题。
    猜你喜欢
    • 1970-01-01
    • 2021-08-15
    • 2015-11-05
    • 1970-01-01
    • 2010-12-20
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多