Canvas 使用Tcl/Tk可以在项目上使用画布标记之前对其进行配置吗?

Canvas 使用Tcl/Tk可以在项目上使用画布标记之前对其进行配置吗?,canvas,tags,tcl,tk,Canvas,Tags,Tcl,Tk,使用Tcl/Tk可以在项目上使用画布标记之前对其进行配置吗 例如,我有以下代码片段: .canvas create rectangle [list 10 10 200 100] -tags t1 在这里,矩形是用标签t1创建的,我可以这样配置这个标签: .canvas itemconfigure t1 -fill red 它用红色填充矩形,因为它被分配了此标记 是否有一种方法可以先指定标记,然后在运行时将这些标记动态分配给其他项,或者在配置标记之前是否需要将标记附加到某个项 我有一个脚本,它

使用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创建矩形0 0 100 100-标记“t1 t2”
将创建一个带有坐标
{0 0 100 100}
的矩形,该矩形有一个红色和黑色的轮廓填充。

嗯,对我来说,事件循环似乎适合这里;它将检测画布中项目的创建,并在创建时调用
itemconfigure
。它可以使用
.canvas find all
来获取当前项目的列表,如果它增加了,则配置最后创建的项目的标记。不确定这对你来说是否合适。标签本身并没有真正的身份;它们只是帆布物品的标签。(它们似乎适用于绑定,但这是因为标签是在事件到达时计算的。不管怎样,IIRC。)