2

単一のprocでtkウィンドウのすべてのウィジェットを無効にする方法はありますか? 引数は、最初のトップレベル パスのみにすることができます。

4

1 に答える 1

6

ウィジェットを指定すると、[winfochildren]を使用してそのウィジェットのすべての子を取得できます。小さな再帰的な手順で、ウィジェットのツリー内のすべてのウィジェットに作用することができます。怠惰になりたい場合は、通常、[infocommands。*]を実行してすべてのウィジェットのリストを取得することもできます。アプリケーションが「。」で始まる名前のプロシージャまたはイメージを作成しない限り、これで十分な場合がよくあります。

ほとんどのtkウィジェットは「-state」オプションを受け入れますが、状態は重要ではないため、通常は無視できません(たとえば、フレームウィジェット)。したがって、すべてのウィジェットを反復処理して、[catch {$ widget configure-statedisabled}]のようなことを行うことができます。これは、他の手段( "state"サブコマンドを持つttkボタンなど)によって有効または無効にする必要がある異常なウィジェットがある場合は機能しません。

標準のウィジェットを使用する単純なアプリケーションがある場合は、次のようなもので十分かもしれません。

proc disable_all {path} {
    catch {$path configure -state disabled}
    foreach child [winfo children $path] {
        disable_all $child
    }
}

正確に制御するには、「[winfo class $ widget]」を使用してウィジェットのクラスを取得し、クラスに応じて異なるコマンドを実行できます。

于 2010-02-08T15:28:29.570 に答える