2013-07-30 32 views
0

創建和放置小部件我的表單是一個基本的兩個標籤框架,其中一個包含複選框,另一個是圖像。在這兩個框架下面是後退和開始按鈕。該窗口預設爲不能更改,但當按下開始按鈕時,屏幕上會顯示其他窗口小部件。不過,我希望在選中複選框並單擊開始按鈕後,才能創建並放置在屏幕上。然後啓動按鈕調用一個稱爲「平衡」的功能。在此代碼中,它創建新的小部件並將它們放置在窗口上。但是,它返回一個錯誤:「壞窗口路徑名」 .lblfrmProgress'」從子程序

#Set Dual UTA Window as top-level 
set UTA .dual_uta 
wm state . withdrawn 
catch {destroy $UTA} 
toplevel $UTA 

#Window Properties 
wm title $UTA {Device: Dual UTA} 
wm maxsize $UTA 522 231 ;#x-500, y-231 
wm minsize $UTA 522 231 ;#x-500, y-231 

以上是創建UTA的別名下一個窗口中的代碼的一部分。我認爲這個窗口是頂層窗口,因此可以使用$ UTA引用。[pathname]。

global UTA .dual_uta 
#**************** DO NOT MODIFY - USER INTERFACE CODE ******************* 

    #Setup window with labels to show progress 
    labelframe $UTA.lblfrmProgress -text "Test Progress" -padx 1 -relief groove -height 145 -width 520 
    label $UTA.lblUTASetup   -text "Dual UTA setup according to image" 
    label $UTA.lblVQuadStart  -text "VQuad is initializing" 
    label $UTA.lblVQTStart   -text "VQT is initializing" 
    label $UTA.lblLMC    -text "Load 'Balanced' Master Configuration" 
    label $UTA.lblTxRx1    -text "Side 1 Tx - Side 2 Rx" 
    label $UTA.lblTxRx2    -text "Side 1 Rx - Side 2 Tx" 

我是否錯誤地引用了窗口變量名?我是否需要通過過程調用來傳遞窗口變量?我只是使用'source Balanced.tcl'來調用文件。

感謝您的幫助!

+0

當我嘗試過的變量值到其他文件,如UTA to Balanced.tcl TCL返回以下錯誤:「錯#參數:應該是'源文件名'」我如何解決這個問題? – ButtahNBred

回答

1

創建 UTA變量的過程?如果是這樣,你也必須在那裏宣佈它是全球性的。

global命令帶有一個或多個變量名,因此global UTA .dual_uta沒有意義。

+0

我不會在proc中創建UTA變量。這個變量是在主文件的開頭創建的,所以我可以創建一個新窗口。一旦所有的小部件都被製作並放置在窗口上,程序就會根據它們如何被調用而被調用。 當「平衡」複選框被選中並且按下開始按鈕時,它會生成這個新文件。這個新文件需要添加特定於測試的小部件到界面。但要將其添加到已經可見的接口中,它必須通過查看變量$ UTA來引用它。我想我正在引用這個窗口? – ButtahNBred

2

您對global的使用似乎有些偏離。特別是,global的每個參數都是要映射的變量的名稱;初始化應單獨完成。或者,你既可以帶來的變量和(可選)與variable命令初始化:

proc whatever {} { 
    variable UTA .dual_uta 

    destroy $UTA; # No error if $UTA doesn't exist 
    toplevel $UTA 
    wm title $UTA {Device: Dual UTA} 
    labelframe $UTA.lblfrmProgress -text "Test Progress" \ 
      -padx 1 -relief groove -height 145 -width 520 
    # Etc. 
} 

它通常被認爲是更好的使用範圍僅限於封閉命名空間的variable這種形式(即全局命名空間,::,除非你另有說明),並且只能在程序中使用單個參數形式。

variable UTA .dual_uta 
proc whatever {} { 
    variable UTA 

    destroy $UTA 
    toplevel $UTA 
    wm title $UTA {Device: Dual UTA} 
    labelframe $UTA.lblfrmProgress -text "Test Progress" \ 
      -padx 1 -relief groove -height 145 -width 520 
    # Etc. 
} 

我自己,我會結構的過程,使「根名稱」窗口層次建立是對過程的參數,在創建過程中綁定的名字到任何回調:

proc whatever {UTA} { 
    destroy $UTA 
    toplevel $UTA 
    wm title $UTA {Device: Dual UTA} 
    labelframe $UTA.lblfrmProgress -text "Test Progress" \ 
      -padx 1 -relief groove -height 145 -width 520 
    # Etc. 
    button $UTA.thingamijig -text "Fluffy Bunny" -command [list doTheCallback $UTA] 
    # ... 
} 

我還會將變量的名稱保存在變量中,以便稍後調用pack/grid調用,以避免必須經常編寫長的窗口小部件路徑。這只是IMO的助記符,但肯定沒有必要。 (綁定路徑名進入回調點菜上面,而不是使用全局/命名空間變量使用list是更好的風格,雖然,比用字符串替換寫回調太大的問題。)

+0

你能糾正任何錯誤觀念並回答這些問題嗎? 1.全局命令用於已經通過變量命令或set命令建立的變量嗎? 2. wm title $ UTA {Device:Dual UTA} < - 這是否在全局命名空間之外創建? 3.將小部件保存到變量名稱就像使用-variable標誌一樣簡單? 4.你能否解釋一下「列表」的想法,或者指給我一個明確解釋它的網站。 感謝您的建議。我清楚地表明自己是TCL的完全諾貝爾獎。 – ButtahNBred

+0

無視問題2.我知道那是什麼。大聲笑 – ButtahNBred