2016-02-29 182 views
1

我想在選擇它時選擇其他檢查按鈕並將它們灰顯出來。 我曾經爲每個這些按鈕設置一個變量從主使用變量設置爲true爲所有但這會拋出錯誤說「無效命令名稱1」TCL:如何創建一個選擇其他檢查按鈕的檢查按鈕

我的代碼片段看起來像這樣。

checkbutton .top.l.all -text "Select ALL" -variable "select_all" -command { [set sanity_check 1] [set verilog_check 1] [set lef_check 1] [set lib_check 1][set apl_check 1] } -font TEMP_varwidth 
checkbutton .top.l.g1 -text "File name and operating conds checks" -variable "sanity_check" -command "run_file_ops" 
checkbutton .top.l.g2 -text "Syntax Checks for Verilog" -variable "verilog_check" -command "run_verilog_check" 
checkbutton .top.l.g3 -text "Syntax Checks for LEF" -variable "lef_check" -command "run_lef_check" 
checkbutton .top.l.g4 -text "Syntax Checks for .lib" -variable "lib_check" -command "run_lib_check" 
checkbutton .top.l.g5 -text "Syntax Checks for APL" -variable "apl_check" -command "run_apl_check" 
grid .top.l.all -row 1 -column 2 -sticky nw 
grid .top.l.g1 -row 2 -column 2 -sticky nw 
grid .top.l.g2 -row 3 -column 2 -sticky nw 
grid .top.l.g3 -row 4 -column 2 -sticky nw 
grid .top.l.g4 -row 5 -column 2 -sticky nw 
grid .top.l.g5 -row 6 -column 2 -sticky nw 

回答

2

這是因爲您正在評估命令兩次。想象一下,它是這樣的(因爲它本質上是怎麼回事):

checkbutton .top.l.all -text "Select ALL" -variable "select_all" -command { 
    [set sanity_check 1] 
    [set verilog_check 1] 
    [set lef_check 1] 
    [set lib_check 1] 
    [set apl_check 1] 
} -font TEMP_varwidth 

你是否認爲這將是正確的嗎? set先評估,然後返回設定值1。然後-command接受發生錯誤的'命令'{1 1 1 11}。做正確的方法是:

checkbutton .top.l.all -text "Select ALL" -variable "select_all" -command { 
    set sanity_check 1 
    set verilog_check 1 
    set lef_check 1 
    set lib_check 1 
    set apl_check 1 
} -font TEMP_varwidth 

如果你想它的一行,就變成:

checkbutton .top.l.all -text "Select ALL" -variable "select_all" -command {set sanity_check 1; set verilog_check 1; set lef_check 1; set lib_check 1; set apl_check 1} -font TEMP_varwidth 

按照意見,這裏有一個樣本:

  • 設置選中所有選中所有其他檢查按鈕時,全選checkbutton未選中
    • 執行值爲每個checkbutton的命令
    • 灰色出值爲每個checkbutton命令
  • 反向從選擇時,如果選擇全部checkbutton被檢查了所有被點擊了明顯的變化(我縮短了窗口小部件的名稱,以便能夠對它們進行測試在我身邊)。


checkbutton .all -text "Select ALL" -variable "select_all" -command select_all -font TEMP_varwidth 

proc select_all {} { 
    upvar sanity_check sa verilog_check v lef_check le lib_check li apl_check a select_all se 
    if {$se == 1} { 
    # First change the checkbuttons 
    set sa 1 
    set v 1 
    set le 1 
    set li 1 
    set a 1 
    # Execute their commands 
    run_file_ops 
    run_verilog_check 
    run_lef_check 
    run_lib_check 
    run_apl_check 
    # Grey them out 
    .g1 configure -state disabled 
    .g2 configure -state disabled 
    .g3 configure -state disabled 
    .g4 configure -state disabled 
    .g5 configure -state disabled 
    } else { 
    # Change the checkbuttons 
    set sa 0 
    set v 0 
    set le 0 
    set li 0 
    set a 0 
    # Change them back to normal 
    .g1 configure -state normal 
    .g2 configure -state normal 
    .g3 configure -state normal 
    .g4 configure -state normal 
    .g5 configure -state normal 
    } 
} 
+0

事實上,我確實找到了一種方法,稍後您可以對一行進行相似處理,謝謝。 但我的下一個疑問是,即使這些按鈕是在小部件中選擇的,鏈接到這些按鈕的實際命令從未得到執行,至少在我的情況下。 我的意思是.top.l.g1 ...到.top.l.g5,按鈕。 –

+0

@DanishSheikh我不確定我完全理解。你想選擇所有複選框也選擇無? – Jerry

+0

我想要以下內容: 1)主按鈕「Select_All」選中時,將所有其他子按鈕設置爲true,同時執行與所有子按鈕鏈接的proc(我在這裏將命令混淆爲所有子按鈕沒有在主按鈕「Select_all 「被選中)。 2)我想在取消選中主控時取消選中所有子控制按鈕。 3)勾選主按鈕「Select_All」時,將所有子檢查按鈕變灰。 –

3

而不是在 「全選」 按鈕,複製所有按鈕的邏輯,只需要使用invoke命令以編程方式單擊它們:

checkbutton .top.l.all -text "Select ALL"  \ 
         -variable "select_all" \ 
         -font TEMP_varwidth \ 
         -command select_all 

proc select_all {} { 
    foreach w {.top.l.g1 .top.l.g2 .top.l.g3 .top.l.g4 .top.l.g5} { 
     $w invoke 
     $w configure -state disabled 
    } 
} 

,將設置按鈕的狀態並執行它們的命令。