当检查是否存在canva对象时,为什么信息总是返回0(Tcl / Tk 8.5)

时间:2014-07-27 14:35:58

标签: canvas tcl tk

我尝试了以下测试(请参阅下面的代码段):

并且它总是返回0,无论画布对象(在这种情况下是矩形)是否已创建(使用“create”)或删除(使用“delete”)。

是否有其他方法可以检查画布对象是否存在或是否已在Tcl / Tk中成功删除?

谢谢!

Serge Hulne

    ############

    tk::canvas .can
    set r1 [.can create rect 30 10 120 80  -outline #fb0 -fill #fb0]
    set r2 [.can create rect 150 10 240 80 -outline #f50 -fill #f50]
    set r3 [.can create rect 270 10 370 80 -outline #05f -fill #05f]
    pack .can


    ##
    ##info exists does not work for canvas elements : it always returns 0
    set rcc [info exists $r2]
    puts "rcc = $rcc"


    if {[info exists $r2]} {
        puts "$r2 exists !"
       .can delete $r2
        puts [info exists $r2]
     } else {
         puts "$r2  does not exist !"
         set rc [info exists $r2]
         puts "rc = $rc  "
    }
    ##
    ##        
    wm title . "colors"
    wm geometry . 400x100+300+300

    ##########

1 个答案:

答案 0 :(得分:0)

info exists用于检查变量是否存在。画布小部件不是变量,它是小部件

因此,您需要使用winfo exists来检查画布是否存在:

winfo exists .can

但话又说回来,你在代码中用作r2的是画布中的一个项目,据我所知,没有命令检查它的存在。但是,您可以使用.can find all获取画布中所有项目的列表,并将其与r2进行比较:

% tk::canvas .can
% set r1 [.can create rect 30 10 120 80  -outline #fb0 -fill #fb0]
% set r2 [.can create rect 150 10 240 80 -outline #f50 -fill #f50]
% set r3 [.can create rect 270 10 370 80 -outline #05f -fill #05f]

% puts $r2
2  # Because it is the second item created
% .can find all
1 2 3

然后,您可以执行lsearch -exact [.can find all] $r2之类的操作,如果您收到的内容不是-1,请知道该项目存在。


虽然如果您对商品使用唯一标记,则可以使用.can find withtag来验证其存在:

% tk::canvas .can
% set r1 [.can create rect 30 10 120 80  -outline #fb0 -fill #fb0 -tags t1]
% set r2 [.can create rect 150 10 240 80 -outline #f50 -fill #f50 -tags t2]
% set r3 [.can create rect 270 10 370 80 -outline #05f -fill #05f -tags t3]

% .can find withtag t2
2  # which is equal to $r2