Tcl 独立于键盘的移位检测方法+;数字

Tcl 独立于键盘的移位检测方法+;数字,tcl,tk,Tcl,Tk,我希望能够检测到用户何时按数字。此部分使用的是绑定(下面的代码)。 但当用户按下Shift+数字键时,我需要做出不同的反应。我尝试过,但它不起作用,因为按Shift+数字将创建与字符对应的事件,如,@,,$,%,,&,*,(,) 人们可以“听”这些字符,但问题是它们在所有键盘上的位置都不一样 QWERTY-英语 AZERTY-用于比利时部分地区 不仅不同的布局(QWERTY、AZERTY、DVORAK等)不同,甚至两个不同的QWERTY键盘也可能因您所在的地区而异。(我的qwerty键盘与图

我希望能够检测到用户何时按数字。此部分使用的是
绑定(下面的代码)。 但当用户按下Shift+数字键时,我需要做出不同的反应。我尝试过
,但它不起作用,因为按Shift+数字将创建与字符对应的事件,如
@
$
%
&
*

人们可以“听”这些字符,但问题是它们在所有键盘上的位置都不一样

QWERTY-英语

AZERTY-用于比利时部分地区

不仅不同的布局(QWERTY、AZERTY、DVORAK等)不同,甚至两个不同的QWERTY键盘也可能因您所在的地区而异。(我的qwerty键盘与图中所示的
^
中的
6
键相同)

因此,“听诸如
感叹号
美元
符号和
等东西是一种依赖键盘检测移位+数字的方法

问题:如何以独立于键盘的方式进行操作?

frame .f -padx 50 -pady 50
focus -force .f
label .f.digit_label -text "Digit:" -padx 50 -pady 20
label .f.keypress_label -text "KeyPress" -padx 50 -pady 20
pack .f
pack .f.digit_label
pack .f.keypress_label
bind .f <Key-1> {::digit_press %K}
bind .f <Key-2> {::digit_press %K}
bind .f <Key-3> {::digit_press %K}
bind .f <Key-4> {::digit_press %K}
bind .f <Key-5> {::digit_press %K}
bind .f <Key-6> {::digit_press %K}
bind .f <Key-7> {::digit_press %K}
bind .f <Key-8> {::digit_press %K}
bind .f <Key-9> {::digit_press %K}
bind .f <Key-0> {::digit_press %K}

bind .f <Shift-1> {::digit_press %K}
bind .f <Shift-2> {::digit_press %K}
bind .f <Shift-3> {::digit_press %K}
bind .f <Shift-4> {::digit_press %K}
bind .f <Shift-5> {::digit_press %K}
bind .f <Shift-6> {::digit_press %K}
bind .f <Shift-7> {::digit_press %K}
bind .f <Shift-8> {::digit_press %K}
bind .f <Shift-9> {::digit_press %K}
bind .f <Shift-0> {::digit_press %K}
bind all <Escape> {exit}
bind all <KeyPress> {::keypress %K}


proc ::digit_press {str} {
    .f.digit_label configure -text "Digit: $str"
}
proc ::keypress {str} {
    .f.keypress_label configure -text "KeyPress: $str"
}
frame.f-padx 50-pady 50
聚焦力
标签f.数字标签-文本“数字:”-padx 50-pady 20
标签f.keypress_标签-文本“keypress”-padx 50-pady 20
包装f
包装f.数字标签
包装f.keypress_标签
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
bind.f{::数字\按%K}
绑定所有{exit}
绑定所有{::按键%K}
过程::数字按下{str}{
.f.数字标签配置-文本“数字:$str”
}
proc::keypress{str}{
.f.keypress_标签配置-文本“keypress:$str”
}

编写软件时,大多数情况下,您需要的是键的现成符号名或它们编码的字符。在您的情况下并非如此。Tk通常会对您隐藏低级别,但如果您准备解码它,您可以得到它。特别是,如果您是在原始愿望中这样做的:

bind . <Key> {
    puts "%A:::%s:::%k:::%K"
}

如您所见,
%k
字段报告在shift状态下不会更改的键代码,
%s
字段在shift键按下时变为1(这是一个位图,因此使用
[expr{%s&1}]
来测试)。您也必须扔掉事件。

您需要要求用户执行一次性设置任务以按0-9数字键,以便您可以记录他们机器的相应键码。我的键盘返回的“1”键的键码为10。哇,在Macbook上非常不同:
1:::0::49::1
{}::1:::131072:::Shift_L
!:::0:::33:::惊叹号
--Shift+1的状态为零。此外,我使用的是右Shift键。我不知道什么是键码是否有任何通用定义。我知道它们是键盘事件中的原始信息(不确定使用输入方法会得到什么)Tk为您将其映射到字符(为您处理键盘重新映射事件),但实际不同键盘的细节是我不知道的。@Henriaugus对键
1
的键码映射进行快速测试。
0
在我的机器上给出
%k
为:26、27、28、29、31、30、34、36、33、37。是的,不是连续的。没有订购。我不知道为什么。(32和35分别是
-
=
)这是在2019年末使用英国布局的macBook Pro上测试的,运行的版本是X11(因为那是我方便地使用的Tk版本)。如果你真的要在X11上运行,你可以。使用非常旧的本机版本,我会得到完全不同的键码(这似乎是一个词中包含的两个值;上半个词似乎是相关的)。
1:::0:::26:::1
2:::0:::27:::2
3:::0:::28:::3
{}:::0:::68:::Shift_R
!:::1:::26:::exclam
@:::1:::27:::at
£:::1:::28:::sterling