使用Tcl / Tk可以在项目上使用它们之前配置canvas标签吗?
例如,我有以下代码段:
.canvas create rectangle [list 10 10 200 100] -tags t1
这里使用标签t1
创建矩形,我可以像这样配置这个标签:
.canvas itemconfigure t1 -fill red
用红色填充矩形,因为它被分配了这个标记。
有没有办法可以先指定标签,然后在运行时动态地将这些标签分配给其他项目,或者标签是否需要在项目配置之前附加到项目上?
我有一个脚本,它首先尝试执行标记配置,然后将标记应用于项目,并且没有任何更改。我知道标签已分配给该项目,只是标签似乎以前没有配置过。因此,这就引出了如何在不将其分配给项目的情况下创建标记的问题?
答案 0 :(得分:0)
FWIW,这是一个proc
,用于“监听”名为.c
的画布中的项目添加。
package require Tk
canvas .c
pack .c
set citem [list] ;# list kept by the proc
proc item_config {} {
global citem
set litem [.c find all] ;# Get list of current items in .c
if {[llength $litem] > [llength $citem]} {
set tags [.c gettags [lindex $litem end]] ;# get latest addition
set code {.c itemconfigure [lindex $litem end]} ;# code to be executed
set changes 1 ;# 0 means no changes
foreach tag $tags {
switch $tag {
t1 {append code " -fill red"} ;# if tag is t1, fill red
t2 {append code " -outline black"} ;# if tag is t2, outline black
default {set changes 0} ;# if no tags, no change
}
}
if {$changes} {eval $code} ;# eval the built code
set citem $litem ;# update list of items
}
after 100 "item_config" ;# recurse
}
item_config
注意:上述过程不考虑任何项目删除。为了满足这一需求,您可以比较$citem
和$litem
,看看是否有一个列表中的任何元素不在另一个列表中,只处理不在$citem
中的元素。
如果您执行的.c create rectangle 0 0 100 100 -tags "t1 t2"
会创建一个带有{0 0 100 100}
的矩形的矩形,其中有一个红色和黑色轮廓的填充。