我尝试了以下测试(请参阅下面的代码段):
并且它总是返回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
##########
答案 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