使用 Tcl/Tk 可以在将画布标签用于项目之前对其进行配置



使用 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}具有红色和黑色轮廓的填充。

相关内容

  • 没有找到相关文章

最新更新