0

Tk ウィジェットの「タイプ」を知る方法はありますか?

tk::label例として、コマンドまたは コマンドを使用してラベルを作成するとしますttk::label

その後、ウィジェットのパス名を取得します。たとえば、.l. ここで、ビルドに使用されたコマンドを知りたいと思い.lます。

私が必要としているのは、プログラムによるソリューションです。.lパスを指定すると、コマンドの名前を返すことができるコードがいくつかあります。Tcl ソリューション、または C でコーディングされた Tcl 拡張機能にも興味があります

これを行う方法は、すべてのウィジェット作成コマンドの名前を変更して、その情報をどこかに保存し、元のコマンドとまったく同じように実行するプロシージャを使用することですが、この解決策では、使用可能なすべてのウィジェット作成コマンドを知っている必要があり、時間はかかりません。ユーザー定義のウィジェット (またはメガウィジェット全体) を考慮します。

ご助力ありがとうございます。

4

1 に答える 1

3

このwinfo classコマンドはウィジェットのクラスを教えてくれますが、通常はこれで十分です (このインタラクティブ セッションを参照してください)。

% label .tklabel;       puts [winfo class .tklabel]
Label
% ttk::label .ttklabel; puts [winfo class .ttklabel]
TLabel

作成時に、標準の Tk トップレベルと Ttk ウィジェットのクラスを設定できることに注意してください。これにより、物事がかなり複雑になる可能性があります。トップレベルを使用する[winfo toplevel $w] eq $wと、真かどうかを確認できますが、8.5 以降では、トップレベルを別のウィジェットの子として再親化するか、クラシック フレームをトップレベルに ( wm forget/を介してwm manage) 変換できるため、これは保証されたテストではありません。

ウィジェットの作成に使用された正確なコマンドを取得する必要がある場合、本当に確実な唯一の方法は、次のように、作成コマンドをトラップして情報をログに記録することです。

rename frame the_real_frame
proc frame {pathName args} {
    set ::creationInfo($pathName) [list frame $args]
    the_real_frame $pathName {*}$args
}

通常、そのような複雑さを回避しようとする方が簡単です (特に、本番環境では、イベントを処理するように設定する必要がある<Destroy>ため、存在しないウィジェットに関する情報をクリーンアップする必要があります。これにより、さらに多くのトリッキーさが追加されます)。 )。

于 2013-03-10T17:30:20.850 に答える