Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl/Tk中按钮命令的自动分配_Tcl_Tk - Fatal编程技术网

Tcl/Tk中按钮命令的自动分配

Tcl/Tk中按钮命令的自动分配,tcl,tk,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 [

我有一个从列表中自动创建标签的代码。我想将标签更改为按钮,并根据按钮类型和一些参数为每个按钮指定命令。我试着这样做:

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}
}
proc create_prop_menu{{{inst”“}{
设置wdth 90
w组20
如果{$inst==“”}{
放置“请先选择块,然后选择属性信息”
返回
}
设置单元格[获取单元格$inst]
设置单元名称[单元名称获取单元名称$cell]
设置inst_name[inst_get_name$inst]
捕获{destroy.prop_menu}
toplevel.prop_菜单
#主机架
frame.prop_menu.main_frame-浮雕“凹槽”-bd 2
包装。道具菜单。主框架
设置lbl[label.prop\u menu.main\u frame.cell\u name\u lbl-浮雕平面-文本“cell name:”-宽度$w]
设置lbl2[entry.prop\u menu.main\u frame.cell\u name-浮雕平面-宽度$wdth]
$lbl2插入0$cell\u名称
$lbl2配置-状态只读
网格$lbl-第1行-第1列-第1行
网格$lbl2-第1行-第2列-新南威尔士州
设置r2
foreach fd[获取所有属性$cell]{
set n[属性\u获取\u名称$fd]
如果[cequal$n“值”]{
设置v[获取属性$inst值]
}否则{
设置v[get_value_on_object$fd[get_id$cell]]
}
如果![cequal“无”$v]{
设置cmd“”
如果{[cequal$n“type”]}{
设置l“类型:”
设置t$v
}elseif{[cequal$n“信号”]}{
设置l“信号:”
集合t[qb_压缩_名称$v1]
set cmd[列表“从属性“$n”中选择网络]
}elseif{[cequal$n“时钟”]}{
设置l“时钟:”
集合t[qb_压缩_名称$v1]
set cmd[列表“从属性“$n”中选择网络]
}其他{[cequal$n“参考供应”]}{
设置l“参考Suply:”
集合t[qb_压缩_名称$v1]
set cmd[列表“从属性“$n”中选择网络]
}elseif{[cequal$n“stackup_file”]}{
设置l“堆叠文件:”
设置t$v
set cmd[列表“从_prop”$n中选择_文件]
}elseif{[cequal$n“doe_文件”]}{
设置l“DOE文件:”
设置t$v
set cmd[列表“从_prop”$n中选择_文件]
}elseif{[cequal$n“lay_file”]}{
设置l“播放文件:”
设置t$v
set cmd[列表“从_prop”$n中选择_文件]
}elseif{[cequal$n“prs_文件”]}{
设置l“PRS文件:”
设置t$v
set cmd[列表“从_prop”$n中选择_文件]
}elseif{[cequal$n“netlist_文件”]}{
设置l“网络列表文件:”
设置t$v
set cmd[列表“从_prop”$n中选择_文件]
}elseif{[cequal$n“ckt_文件”]}{
设置l“CKT文件:”
设置t$v
set cmd[列表“从_prop”$n中选择_文件]
}elseif{[cequal$n“sparam_文件”]}{
设置l“S参数文件:”
设置t$v
set cmd[列表“从_prop”$n中选择_文件]
}elseif{[cequal$n“type_order”]}{
设置l“类型顺序:”
设置t$v
设置cmd“从属性中选择类型和顺序”
}否则{
设置l“无”
设置t$v
}
#放置“$n->$l->$v”
如果{![cequal“NONE”$l]}{
lappend cmd$inst
如果[cequal$l”类型:“]{
设置lbl[label.prop_menu.main_frame.lbl_$n-浮雕平面-文本$l-宽度$w]
}否则{
设置lbl[button.prop\u menu.main\u frame.lbl\u$n-text$l-width$w-command“\{$cmd\}”
}
设置lbl2[entry.prop\u menu.main\u frame.val\un-浮雕平面-宽度$wdth]
$lbl2插入0$t
$lbl2配置-状态只读
网格$lbl-行$r-列1-行
网格$lbl2-行$r-列2-新南威尔士州
设置r[expr$r+1]
}
}
}
在“实例名称”中设置
设置sep[ttk::separator.prop\u menu.main\u frame.sep-水平定向]
设置lbl[label.prop\u menu.main\u frame.inst\u name\u lbl-relief flat-text“实例名称:”-width$w]
设置lbl2[entry.prop_menu.main_frame.inst_name-浮雕平面-宽度$wdth]
$lbl2插入0$inst\U名称
$lbl2配置-状态只读
网格$sep-行$r-列span 2
网格$lbl-行[expr$r+1]-列1-行
网格$lbl2-行[expr$r+1]-列2-新南威尔士州
设置ok_btn[按钮。属性菜单。主框架。ok_b-文本“ok”-命令{prop_菜单\u ok_按钮}]
网格$ok_btn-行[expr$r+2]-第1列-第2列-粘性nsew
抓住释放装置。
抓斗设置。道具菜单
将顶层的属性菜单居中
bind.prop_menu{prop_menu_ok_button}
}
但它不起作用。它所做的不是用参数
lay\u file$inst
运行函数
choosed\u file\u from\u prop
,而是尝试运行一个名为
choosed\u file\u from\u prop lay\u file$inst
的函数,并告诉我它不存在


有没有一种方法可以克服这个问题,而不必为每个可能的标签创建不同的函数,也不必将
$inst
变成一个全局变量?

如果您使用
list
生成了一个命令,您只需将它与
-命令一起使用,而无需进一步包装。不要把
{
/
}
放在它周围


也就是说,与此相反:

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]