1

tk::text ウィジェットのすべての変更を監視したいと考えています。

私の最初のステップは、単純にすべての<Key>イベントを取得して監視ルーチンに送信することでしたが、テキスト ウィジェットにテキストをコピーするとうまくいきません。

<Modified>仮想イベントを見つけました。これにより、テキスト ウィジェットのすべての変更に対応できるようになりますが、変更の種類を特定する方法が見つかりませんでした。

私の実際の問題では、ウィジェットに挿入されたすべての文字またはテキストを取得すれば十分です。挿入の位置やその他の属性を取得することは重要ではありません。

次に試みたのは、<Button-2>イベントをバインドすることでした。これにより通知が表示されますが、挿入されたテキストを取得できませんでした。ウィジェットにコピーされる X から実際に選択されたテキストを取得する方法はありますか? これでも十分でしょう。

4

1 に答える 1

1

挿入、削除、および置換(他のすべての変更の要約)の通知が必要な場合、最も簡単な方法はinsertdeleteおよびreplaceメソッドをインターセプトすることです。TclOOラッパーを使用してこれを行う方法は次のとおりです。

oo::class create Text {
    unexport destroy
    constructor {w} {
        rename $w [namespace current]::realwidget
        bind $w <Destroy> [namespace code {my destroy}]
    }
    self method create {w args} {
        rename [my new [::text $w {*}$args]] ::$w
        return $w
    }

    method DoingModification args {
        # Override this method to find out
    }

    method delete args {
        my DoingModification {*}$args
        tailcall realwidget delete {*}$args
    }
    method insert args {
        my DoingModification {*}$args
        tailcall realwidget insert {*}$args
    }
    method replace args {
        my DoingModification {*}$args
        tailcall realwidget replace {*}$args
    }
}
# Everything else should just be forwarded; there's a lot of methods to do
# so we loop over them all...
foreach method {
    bbox cget compare configure count debug dlineinfo dump edit get image
    index mark peer scan search see tag window xview yview
} {
    oo::define Text forward $method realwidget $method
}

その後、ウィジェットを作成して変更を簡単に見つけることができ、それ以外はすべて通常どおりに機能します。

set w [Text create .t]
oo::objdefine $w method DoingModification {method args} {
    puts "Doing a $method on $args"
}
pack $w
于 2013-01-10T11:54:33.833 に答える