2012-06-20 1 views
0

레이블에서 자동으로 레이블이 생성되는 코드가 있습니다. 레이블을 단추로 변경하고 각 매개 변수의 유형에 따라 매개 변수와 함께 명령을 할당하려고합니다. 나는 이것을 시도했다 :Tcl/Tk의 버튼에 명령 자동 할당

proc create_prop_menu {{inst ""}} { 

    set wdth 90 
    set w 20 

    if {$inst == ""} { 
     puts "please select a block first , then Propertires info " 
    return 
    } 


    set cell [get_cell $inst] 
    set cell_name [cell_get_name $cell] 
    set inst_name [inst_get_name $inst] 
    catch {destroy .prop_menu} 
    toplevel .prop_menu 
    # Main Frame 
    frame  .prop_menu.main_frame -relief "groove" -bd 2 
    pack  .prop_menu.main_frame 

    set lbl [label .prop_menu.main_frame.cell_name_lbl -relief flat -text "Cell Name:" -width $w] 
    set lbl2 [entry .prop_menu.main_frame.cell_name -relief flat -width $wdth] 
    $lbl2 insert 0 $cell_name 
    $lbl2 configure -state readonly 
    grid $lbl -row 1 -column 1 -sticky nse 
    grid $lbl2 -row 1 -column 2 -sticky nsw 

    set r 2 

    foreach fd [get_all_properties $cell] { 
     set n [property_get_name $fd] 
     if [cequal $n "value"] { 
      set v [get_property $inst value] 
     } else { 
      set v [get_value_on_object $fd [get_id $cell]] 
     } 


     if ![cequal "NONE" $v] { 
      set cmd "" 
      if {[cequal $n "type"]} { 
       set l "Type:" 
       set t $v 
      } elseif {[cequal $n "signals"]} { 
       set l "Signals:" 
       set t [qb_compress_names $v 1] 
       set cmd [list "chose_net_from_prop" $n] 
      } elseif {[cequal $n "clocks"]} { 
       set l "Clocks:" 
       set t [qb_compress_names $v 1] 
       set cmd [list "chose_net_from_prop" $n] 
      } elseif {[cequal $n "ref_supply"]} { 
       set l "Reference Suply:" 
       set t [qb_compress_names $v 1] 
       set cmd [list "chose_net_from_prop" $n] 
      } elseif {[cequal $n "stackup_file"]} { 
       set l "Stackup File:" 
       set t $v 
       set cmd [list "chose_file_from_prop" $n] 
      } elseif {[cequal $n "doe_file"]} { 
       set l "DOE File:" 
       set t $v 
       set cmd [list "chose_file_from_prop" $n] 
      } elseif {[cequal $n "lay_file"]} { 
       set l "LAY File:" 
       set t $v 
       set cmd [list "chose_file_from_prop" $n] 
      } elseif {[cequal $n "prs_file"]} { 
       set l "PRS File:" 
       set t $v 
       set cmd [list "chose_file_from_prop" $n] 
      } elseif {[cequal $n "netlist_file"]} { 
       set l "NetList File:" 
       set t $v 
       set cmd [list "chose_file_from_prop" $n] 
      } elseif {[cequal $n "ckt_file"]} { 
       set l "CKT File:" 
       set t $v 
       set cmd [list "chose_file_from_prop" $n] 
      } elseif {[cequal $n "sparam_file"]} { 
       set l "S-Param File:" 
       set t $v 
       set cmd [list "chose_file_from_prop" $n] 
      } elseif {[cequal $n "type_order"]} { 
       set l "Type Order:" 
       set t $v 
       set cmd "chose_type_order_from_prop" 
      } else { 
       set l "NONE" 
        set t $v 
      } 
      #puts "$n -> $l -> $v" 
      if {![cequal "NONE" $l]} { 
       lappend cmd $inst 
       if [cequal $l "Type:"] { 
        set lbl [label .prop_menu.main_frame.lbl_$n -relief flat -text $l -width $w] 
       } else { 
        set lbl [button .prop_menu.main_frame.lbl_$n -text $l -width $w -command "\{$cmd\}"] 

       } 
       set lbl2 [entry .prop_menu.main_frame.val_$n -relief flat -width $wdth] 
       $lbl2 insert 0 $t 
       $lbl2 configure -state readonly 
       grid $lbl -row $r -column 1 -sticky nse 
       grid $lbl2 -row $r -column 2 -sticky nsw 

       set r [expr $r + 1] 
      } 
     } 
    } 
    set in "Instance_Name" 
    set sep [ttk::separator .prop_menu.main_frame.sep  -orient horizontal] 
    set lbl [label .prop_menu.main_frame.inst_name_lbl -relief flat -text "Instance Name:" -width $w] 
    set lbl2 [entry .prop_menu.main_frame.inst_name  -relief flat -width $wdth] 
    $lbl2 insert 0 $inst_name 
    $lbl2 configure -state readonly 
    grid $sep -row $r -columnspan 2 
    grid $lbl -row [expr $r+1] -column 1 -sticky nse 
    grid $lbl2 -row [expr $r+1] -column 2 -sticky nsw 

    set ok_btn [button .prop_menu.main_frame.ok_b -text "OK" -command {prop_menu_ok_button}] 
    grid $ok_btn -row [expr $r+2] -column 1 -columnspan 2 -sticky nsew 

    grab release . 
    grab set .prop_menu 
    center_the_toplevel .prop_menu 
    bind .prop_menu <Key-Return> {prop_menu_ok_button} 
} 

그러나 그것은 작동하지 않는다. 매개 변수가 lay_file $instchose_file_from_prop 함수를 실행하는 대신에 chose_file_from_prop lay_file $inst이라는 함수를 실행하려고 시도하고 그것이 존재하지 않는다고 알려줍니다.

$inst을 전역 변수로 만들지 않고 각 가능한 레이블마다 다른 기능을 만들지 않고이를 극복 할 수있는 방법이 있습니까?

답변

1

list으로 명령을 생성 한 경우 추가 포장없이 -command으로 사용할 수 있습니다. 주위에 {/}을 넣지 마십시오.

set lbl [button .prop_menu.main_frame.lbl_$n -text $l -width $w -command "\{$cmd\}"] 

쓰기이 :

set lbl [button .prop_menu.main_frame.lbl_$n -text $l -width $w -command $cmd] 
이 대신에,이다