使用Tcl / Tk可以在项目上使用它们之前配置画布标签吗?

时间:2014-04-05 16:34:39

标签: canvas tags tcl tk

使用Tcl / Tk可以在项目上使用它们之前配置canvas标签吗?

例如,我有以下代码段:

.canvas create rectangle [list 10 10 200 100] -tags t1

这里使用标签t1创建矩形,我可以像这样配置这个标签:

.canvas itemconfigure t1 -fill red

用红色填充矩形,因为它被分配了这个标记。

有没有办法可以先指定标签,然后在运行时动态地将这些标签分配给其他项目,或者标签是否需要在项目配置之前附加到项目上?

我有一个脚本,它首先尝试执行标记配置,然后将标记应用于项目,并且没有任何更改。我知道标签已分配给该项目,只是标签似乎以前没有配置过。因此,这就引出了如何在不将其分配给项目的情况下创建标记的问题?

1 个答案:

答案 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}的矩形的矩形,其中有一个红色和黑色轮廓的填充。