使用 Tcl/Tk 是否可以在将画布标签用于项目之前对其进行配置?
例如,我有以下代码片段:
.canvas create rectangle [list 10 10 200 100] -tags t1
在这里,矩形是使用标签t1
创建的,我可以像这样配置这个标签:
.canvas itemconfigure t1 -fill red
用红色填充矩形,因为它被分配了此标记。
有没有办法先指定标签,然后在运行时将这些标签动态分配给其他项目,或者标签是否需要附加到项目上才能配置?
我有一个脚本,它首先尝试进行标签配置,然后将标签应用于项目,没有任何变化。我知道标签已分配给该项目,只是标签之前似乎没有配置过。所以这就引出了一个问题,如何在不将其分配给项目的情况下创建标签?
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}
具有红色和黑色轮廓的填充。