2012-01-13 6 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_メモリリークが作成されることに注意してください。はい、これは絶対に怒っていますが、それは実際のものです。時間の経過とともに多くのウィジェットを作成する非常に長い実行プログラムがあれば問題になる可能性があります。 (ユニークな名前をつくる他のすべてのスキームも同じリークを持ちます。問題はTkがいくつかの奇妙な理由でパス名コンポーネントをインターンすることです!) –

1

がたくさんありますなど、そこにそれを行うには、いくつかの手の込んだ方法は、おそらくですが、私は一意の名前を必要とするとき私の場合、私はちょうど時間データのうちの1を構成し、

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

その他、各種のようなもの異なるフォーマットの可能性。

これはエレガントではありませんが、私は自分のものに取り組んでいます。また、特定のトラックを保持する必要がある場合にも便利です。私は独自のウィジェット名が必要な場合

+0

同じ秒に複数の名前を生成するとこれは壊れますこれを実行してウィンドウパス名を生成している場合。 –

+0

本当です。私の場合は、必要に応じて最後にいくつかの余分なデータを追加することで、よりユニークであることをさらに確認します。あなたが "プログラム"の速度(例えば、ループなど)で動いている場合ではなく、 "ユーザー"速度(例えばGUI)で一意の名前を作成する必要がある場合は便利だと思います。 – JasonBourne

関連する問題