2013-03-06 59 views
1

我正在创建一小段GUI,这是一个必须完成的流程的进展。我想要的是创建一个用于创建一个GUI当GUI被关闭返回1或0,然后继续流动,这样一个进程:是否有可能创建一个Tcl返回值的GUI?

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

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

回答

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进来三个品种:

为窗口 $w
  1. tkwait window $w等待被销毁。
  2. tkwait visibility $w等待窗口$w变为可见(但在Unix/X11以外的平台上不起作用)。
  3. tkwait variable $varname等待变量$varname被设置;它就像普通的Tcl vwait(事实上vwait最初是tkwait variable,事件循环集成到Tcl之前)。

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

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

+0

使用Tcl 8.6的协同程序可以理清所有这些代码的纠结,但这是另一个更复杂的话题。 – 2013-03-06 10:38:06

相关问题