Как создать уникальные имена для оконных окон Tk toplevel?

Мне нужен способ генерации неиспользуемого имени для окон окна Tk toplevel, так же, как #auto делает это для объектов #auto.

Как я могу это сделать? Может быть, у Tk есть аналогичная утилита?

2 ответа

Когда мне нужны уникальные имена виджетов, я использую что-то вроде этого:

variable sequencecounter 0; # Don't touch outside this code!
proc unique {{parent ""}} {
 variable sequencecounter
 while {[winfo exists [set w $parent.w$sequencecounter]]} {
 incr sequencecounter
 }
 return $w
}

Это гарантирует возврат имени виджета, которого не существует. (Tk гарантированно работает в однопоточном режиме, поэтому вы знаете, что нет неприятных условий гонки). Используйте его так:

set top [toplevel [unique]]
set btn [button [unique $top] -text "Hi" -command { exit }]
pack $btn


Вероятно, есть какой-то причудливый способ сделать это, но в моем случае, когда мне нужны уникальные имена, я просто составляю одни данные за время, что-то вроде

set systemTime [clock seconds];
set myname [concat [clock format $systemTime -format %H%M%S] ".myext"]

Etc и т.д. Существует множество различных возможностей форматирования.

Это не изящно, но я работаю над своими вещами, и это полезно, также если вам нужно следить за ними.

licensed under cc by-sa 3.0 with attribution.