2016-03-19 7 views
0

私はTcl/Tkプログラムを持っています。 choicesの実行であるコンボボックスポストは、私が欲しいものttk :: unpolostの検出:: combobox

set cb [ttk::combobox .cb -state readonly -textvariable selection -postcommand [list choices .cb]] 

PROC:その中で私はそうのようなコンボボックスを持っています。私の質問は、どのように私はコンボボックスがunpostsを検出するのですか?

私は<<ComboboxSelected>>にバインドし、可変トレースをselectionに設定しようとしました。それぞれの問題は、ユーザーが実際に選択を変更したときにのみ発生することです。私はいつもコンボボックスが通知されないときに何らかの方法で検出する必要があります。

ありがとうございます!

編集私が達成しようとしている何

コンボボックスのポストそれはオプションのリストをユーザに提示します。私は、オプションが何を意味するのかをユーザーが知ることを期待していないので、私はプログラムの別の領域でオプションを視覚的に強調しています。私はこれを強調表示し、-postcommandとうまくいっています。問題は、強調表示をいつオフにするかを知ることです。

<<ComboboxSelected>>ユーザーが選択した値を変更しない場合は発生しません。

<Leave>および<FocusOut>が早すぎます(たとえば、ボックスのポストの直後など)。

+0

あなたはに特異的に結合することができます:あなたのコールバックは、それが与えられたイベントは、トップレベルのため実際であることを確認する必要があります。 –

+0

私はの両方を試しました。どちらも、コンボボックスの投稿の直後に(つまり、cbがクリックされるとすぐに)起動するように見えますが、これは早すぎます。私は、コンボボックスがポストすると、フォーカスを取得するフローティングリストボックスを作成すると思います。フローティングリストボックスがいつ破壊されるかを知る方法が必要です。 – Imbue

答えて

1

TTK ::コンボボックスで使用されるリストボックスのウィンドウ名は次のとおりです。

set popdown [ttk::combobox::PopdownWindow .combobox].f.l 

私は、これは何が必要であると考えています。

bind <Leave> $popdown mycommand 
+0

あなたの答えをありがとう。私のコンボボックスには '.f.1'という子はありません。私は 'winfo children'を実行しましたが、' .popdown'という子を持っています。私が '$ combobox.popdown'にバインドすると動作するようですが、間欠的にしか動作しません。 これは良いクロスプラットフォームソリューションではなく、Tkのバージョン間で安定していることさえ気になります。 – Imbue

+0

.fにする必要があります。 、.f。

+0

'[ttk :: combobox :: PopdownWindow .combobox] .f.l'はクロスプラットフォームで動作します。私は彼らがttk :: combobox :: PopdownListboxコマンドを持っていたらいいのに、そうでなければ安全です。 'ttk :: combobox :: PopdownWindow'はリストボックスウィンドウが存在することを確認するので、' $ combobox.popdown'は直接使用しません。 –

1

コンボボックスのポップダウンは、実際に窓の独自の巣で、あなたのコンボボックスが.cb呼び出された場合、その後ポップダウンは想像力名前.cb.popdown(この実装とが保証されていないことをノート)を持っています。そのウィジェットの​​イベントへのバインディングを追加すると、未送達通知が表示されます。​​イベントは、ウィンドウが仮想デスクトップレイヤーの意味で表示されなくなったときに送信される通知です(別のウィンドウが上に表示されているため、目に見えなくなるのではなく、イベントもありますが、プラットフォーム)。

トリッキーなビット:

  • 必要なときにポップダウンが通常作成される、すなわち、それは最初に表示するとき。バインドする前に、ウィンドウが存在する必要があります(必ずしも可視である必要はありません)。ポップダウンウィジェットのハンドルはttk::combobox::PopdownWindowで取得できます。ウィジェットが存在しない場合はウィジェットが作成されます。 (これは、実装の一部だが、名前よりも安定である可能性が高いです。)

    set popdown [ttk::combobox::PopdownWindow .cb] 
    bind $popdown <Unmap> {yourCallback %W} 
    

    ポップダウンの内部構成の中に周りを掘ることが可能であるが、私はそれをお勧めしません。 多くはが警告なく変更される可能性があります。

  • トップレベルにバインドすると、サブウィンドウのイベントも配信されるという通常の問題があります。

    proc yourCallback {w} { 
        if {$w ne [winfo toplevel $w]} { return } 
        # The rest of your code here... 
    } 
    
+0

'ttk :: combobox :: PopdownWindow'のドキュメントがどこにあるのか教えてください。ここにはない:http://www.tcl.tk/man/tcl8.5/TkCmd/ttk_combobox.htm – Imbue