2012-01-13 73 views

回答

1

当我需要独特的小部件的名称,我用的是这样的:

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 
+0

但请注意这会创建一个_subtle_内存泄漏,这是widget名称本身的独特组件。是的,这听起来很疯狂,但它是真实的,如果你有一个长时间运行的程序,随着时间的推移创建许多小部件,这可能是一个问题。 (所有其他创建独特名称的方案也会有相同的泄漏问题,因为一些奇怪的原因,Tk实习路径名组件!) – 2012-01-15 22:12:09

1

有可能是做一些华丽的方式,但对我来说,当我需要独特的名字,我只构成一个出时间数据,像

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

等等,等等有很多不同的格式化可能性。

这不是优雅的,但我有它的工作在我的东西,它是有用的,也如果你需要保持一定的轨道。

+0

如果你在同一秒内生成多个名字,这很可能会中断如果你正在这样做来生成窗口路径名。 – 2012-01-15 20:26:48

+0

这是真的。就我而言,我会做一些进一步的检查,以确保它在最后附加一些额外的数据(如果有必要),以确保它更独特。如果您需要以“用户”速度创建独特的名称(例如,gui),但是如果您让它们以“程序”速度运行(例如,循环等),则我认为它非常方便 – JasonBourne 2012-01-16 05:25:27