2011-04-20 64 views
0

我在Tcl/Tk中有一個簡單的窗口,它在點擊OK按鈕時運行模擬。我正在使用Linux。模擬完成時窗口被破壞。問題是仿真運行時,窗口仍然存在。點擊確定按鈕後,我想讓窗口消失。Tcl/Tk-如何在OK模式下點擊確定按鈕時窗口消失如何運行模擬

我試過使用wm withdraw .mywindow,但它使窗口顯示的區域(包含OK按鈕)變成白色。我發現update雖然谷歌搜索,但據說是harmful

+0

也許產生一個新的進程/叉來做模擬?不是一個真正的答案,但可以作爲解決方案 – 2011-04-20 22:35:13

+0

或啓動一個線程。許多可能性,每個都有利於和反對的東西。 – 2011-04-23 11:21:25

+0

'Update'被認爲是有害的,因爲它很容易陷入嵌套的事件循環,消耗大量的C棧。 – 2011-04-23 11:23:45

回答

3

如果你這樣做wm withdraw .mywindow,窗口不會實際上消失,直到輸入事件循環,因爲它是處理重畫屏幕的事件循環。

你有幾個選擇來解決你的問題。首先,你可以撥打update idletasks。這是update上的一個變體,它只處理「空閒」任務,如繪製屏幕,​​但不處理響應按鈕和其他用戶生成的事件等任務。所以,解決方案之一就是要做到:

wm withdraw .mywindow 
update idletasks 
run_simulation 

順便說一句,原因update是有害的,因爲它本質上開始一個新的事件循環 - 另一種無限循環。如果在該事件循環中出現一個事件,導致相同的代碼再次運行,則會啓動第三個和第四個,依此類推。作爲一般規則,嵌套的無限循環永遠不是好事。請記住:tcl是單線程的,所以這些事件循環不會並行運行。

另一種解決方案是自然地進入事件循環,並計劃您的模擬在所有其他事件處理完畢後運行。請執行此操作,使用命令after開始仿真。使用after將在事件隊列中放置一個事件。當事件循環到達該事件時,您的模擬將開始。

例如:

wm withdraw .mywindow 
after idle run_simulation 

當上述代碼退出 - 假定它被稱爲作爲一個事件的結果,例如按下按鈕或鍵 - 事件循環將被重新輸入,任何待處理的事件將被處理,然後您的run_simulation命令將運行。順便說一句 - 如果你有一個需要在模擬運行時作出響應的GUI,你應該在tcler的wiki上閱讀Keep a GUI alive during a long calculation。這裏有很多要閱讀的內容,這使得問題看起來比它更難,但它並不像看起來那麼複雜。

+1

+1爲非常好的答案,涵蓋了關鍵的基礎和點去哪裏獲得更多信息。 – 2011-04-23 11:20:25

相關問題