如何在Tcl / Tk中绑定'Control-Control'事件

时间:2018-12-03 09:16:40

标签: events tcl bind

我想将一个非常特定的事件绑定到一个小部件,该事件是“控制键”,然后是另一个“控制键”,类似于KVM操作。

我知道如何绑定各种事件,但不知道如何绑定这两个连续的事件。

有什么想法要实现吗?

2 个答案:

答案 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]
}