2012-01-13 79 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

相關問題