我想监视tk :: text小部件中的每个更改。
我的第一步只是获取所有<Key>
个事件并将它们发送到我的监控例程,但是如果我将一些文本复制到文本小部件中,这将无效。
我发现了一个<Modified>
虚拟事件。这将使我能够对文本小部件中的每个更改做出反应,但我没有找到确定更改类型的方法。
对于我的实际问题,如果我获得插入到我的小部件中的每个字符或文本就足够了。获取插入的位置或其他属性并不重要。
我接下来尝试的是绑定<Button-2>
事件。这会给我一个通知,但我无法获取插入的文本。有没有办法从X获取实际选定的文本,这些文本将被复制到小部件中?这也足够了。
答案 0 :(得分:1)
如果您只想要插入,删除和替换(所有其他修改都归结为)的通知,最简单的方法是拦截insert
,delete
和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