2013-03-06 91 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

相關問題