检测tk :: text小部件中的更改

时间:2013-01-04 15:36:27

标签: widget tk

我想监视tk :: text小部件中的每个更改。

我的第一步只是获取所有<Key>个事件并将它们发送到我的监控例程,但是如果我将一些文本复制到文本小部件中,这将无效。

我发现了一个<Modified>虚拟事件。这将使我能够对文本小部件中的每个更改做出反应,但我没有找到确定更改类型的方法。

对于我的实际问题,如果我获得插入到我的小部件中的每个字符或文本就足够了。获取插入的位置或其他属性并不重要。

我接下来尝试的是绑定<Button-2>事件。这会给我一个通知,但我无法获取插入的文本。有没有办法从X获取实际选定的文本,这些文本将被复制到小部件中?这也足够了。

1 个答案:

答案 0 :(得分:1)

如果您只想要插入,删除和替换(所有其他修改都归结为)的通知,最简单的方法是拦截insertdeletereplace方法。以下是使用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