Почему информация существует всегда возвращает 0 при проверке существования объекта холста (Tcl/Tk 8.5)

Я попробовал следующий тест (см. фрагмент ниже):

и он всегда возвращает 0 независимо от того, был ли объект холста (в данном случае прямоугольник) создан (с помощью «создать») или удален (с помощью «удалить»).

Есть ли другой способ проверить, существует ли объект холста или был ли он успешно удален в Tcl/Tk?

Спасибо !

Серж Халн

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

    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

    ##########

person Serge Hulne    schedule 27.07.2014    source источник


Ответы (1)


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
person Jerry    schedule 27.07.2014
comment
Или вы можете просто проверить длину списка результатов .can itemconfigure $r2; если $r2 не относится к какому-либо элементу, он пуст. - person Donal Fellows; 27.07.2014
comment
@DonalFellows Хорошо, я не думал об этом! - person Jerry; 27.07.2014
comment
Блестяще, спасибо! Так как она возвращает список, команда выглядит следующим образом: if { [llength [.can itemconfigure $r2]] › 0 } { - person Serge Hulne; 27.07.2014