2014-09-29 82 views
0

我有一個打開TK頂層窗口的TCL腳本。在這個窗口中,用戶可以操縱一些小部件(調用其他過程來完成某些工作的按鈕,檢查按鈕等)。當用戶完成時,我希望他單擊此窗口中的一個按鈕,以使頂層被銷燬,並打開它的過程返回一個值。以下是我已經有了:如何從TK頂層窗口返回值?

proc openWindow {} { 
    set w .testwindow 
    catch {destroy $w} 
    toplevel $w 

    <here I setup all the widgets of the window> 

    button $w.btn -text "Exit" -command { 
     set ret [finishTest] 
     puts "returning $ret" 
     return $ret 
    } 

    pack $w.btn 
    pack $w 
} 

proc finishTest {} { 
    <here I evaluate the state of the $w widgets> 
    if {some condition} { 
     destroy $w 
     return 0 
    } else { 
     destroy $w 
     return -1 
    } 
} 

當我打電話的openWindow,窗口顯示和行爲,因爲它應該,當我點擊退出按鈕,它正確打印「迴歸:$ RET」但我煥放打電話[openWindow]在點擊按鈕後,它只打印一個沒有其他字符的新行。

我定義了$ w變量globaly,以便我可以在finishTest過程中在openWindow之外訪問它。

謝謝您的建議!

回答

0

回調函數不會影響局部變量,並且您的openWindow當前沒有在返回之前等待回調進程。爲了使其工作,您必須使用vwait(或tkwait)讓事件循環運行,直到執行回調。 (這是通過運行一個附屬事件循環來實現的,該循環確實需要堆棧空間,所以請注意重入問題。)檢查下面的標記行(您的finishTest未更改)。

proc openWindow {} { 
    global ret;        ######################### 
    set w .testwindow 
    catch {destroy $w} 
    toplevel $w 

    <here I setup all the widgets of the window> 

    button $w.btn -text "Exit" -command { 
     set ret [finishTest];     ######################### 
    } 

    pack $w.btn 
    pack $w 
    vwait ret;         ######################### 
    puts "returning $ret";      ######################### 
    return $ret;        ######################### 
} 

這是可能解開這種混亂與有些Tcl的8.6的協同程序,所提供的呼叫到openWindow可以從coroutine(即,懸浮堆上下文)的內部來完成。這將使代碼的這部分看起來更像(再次注意標記行):

proc openWindow {} { 
    set w .testwindow 
    catch {destroy $w} 
    toplevel $w 

    <here I setup all the widgets of the window> 

    button $w.btn -text "Exit" -command [info coroutine]; ######################### 

    pack $w.btn 
    pack $w 
    yield;             ######################### 
    set ret [finishTest];         ######################### 
    puts "returning $ret";         ######################### 
    return $ret;           ######################### 
} 
+0

謝謝,唐納,這解決了我的問題與從proc返回一個值!但是,正如我在Hoodiecrow的答案中所述,我必須使用Tcl/Tk8.3的非標準解釋器,其行爲與Wish完全不同。它允許我與小部件交互,我可以移動或調整窗口大小,但內部沒有任何反應。我知道這可能是一個完全不同的問題,而不是我最初提出的問題,但是如果你有一個建議,我會對它表示讚賞,謝謝! :) – 2014-09-30 07:44:59