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]