我想将一个非常特定的事件绑定到一个小部件,该事件是“控制键”,然后是另一个“控制键”,类似于KVM操作。
我知道如何绑定各种事件,但不知道如何绑定这两个连续的事件。
有什么想法要实现吗?
答案 0 :(得分:0)
理论上,您将能够使用绑定事件序列来执行此操作:
# The keyboard often has two control keys; they have different names
bind $w <KeyPress-Control_L><KeyPress-Control_L> {puts "double-control (left)"}
bind $w <KeyPress-Control_R><KeyPress-Control_R> {puts "double-control (right)"}
但是,控制键(与其他修饰符一样)以这种方式处理尤为复杂,因为操作系统会为您重复这些操作;他们是特例!因此,您需要建立自己的键盘事件队列:
bind $w <KeyPress> {queueEvent %K}
set queue {no-such-key}
proc queueEvent {key} {
global queue
if {[llength [lappend queue $key]] > 2} {
set queue [lrange $queue end-1 end]
}
lassign $queue last this
if {$last eq $this && [string match Control* $this]} {
puts "double ctrl"
}
}
这可能与其他绑定严重地交互。该如何解决取决于您的应用程序的更广泛的上下文。
答案 1 :(得分:0)
现在,请注意“双击”所需的快速延迟
bind . <KeyPress> {queueEvent %K}
set queue {}
set times {}
proc queueEvent {key} {
global queue times
if {![string match Control* $key]} {set queue {}; set times {}; return}
if {$key eq $queue} {
if {[expr [clock milliseconds] - $times] <= 500} {
puts "double ctrl $key"
set queue {}; set times {}
return
}
}
set queue $key
set times [clock milliseconds]
}