我有一个Tcl/Tk(版本8.6,Ubuntu 14.04)的神秘问题。当我按住一个按钮(例如Return)一段时间并释放它时,程序不再对按键进行适当的反应:它忽略了一些按键,并且它产生了错误的键码(通常是键盘上的按键更长的时间,即使按了其他一些键)。如果事件处理程序需要一些时间(这里使用after
进行模拟),则会出现问题。tcl/tk:关键事件队列溢出错误?
这里是我的脚本testKey.tcl
:
proc keyHandler {keySym keyCode keySymNum} {
puts "keyHandler (t=[clock clicks]): ($keySym) ($keyCode) ($keySymNum)"
flush stdout
if {$keySym == "Return"} { after 500 }
}
bind . <KeyPress> "keyHandler %K %k %N"
如果我运行wish testKey.tcl
脚本,将焦点移动到窗口,按住返回键几秒钟,我不断收到输出线这样的
keyHandler (t=1474120548284090): (Return) (36) (65293)
也解除键,我认为这是预期的行为后的一段时间。但是,当这些输出结束时,按下其他键(与返回不同)会导致错误的行为(按键被忽略,错误的键码被输出)。
对我来说,看起来好像某些关键事件队列溢出。
我非常感谢任何帮助,谢谢!
编辑:我试图重现错误与普通的X11程序,我认为做了类似的事情,以Tk的主循环,但这里的作用是不可见的:
// modified from https://gist.github.com/javiercantero/7753445
// g++ -o xreadkeys xreadkeys.C -lX11
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
Display *display;
Window window;
XEvent event;
int s;
/* open connection with the server */
display = XOpenDisplay(NULL);
if (display == NULL) {
fprintf(stderr, "Cannot open display\n");
exit(1);
}
s = DefaultScreen(display);
/* create window */
window = XCreateSimpleWindow(display, RootWindow(display, s),
10, 10, 200, 200, 1,
BlackPixel(display, s),
WhitePixel(display, s));
/* select kind of events we are interested in */
XSelectInput(display, window, KeyPressMask | KeyReleaseMask);
/* map (show) the window */
XMapWindow(display, window);
/* event loop */
long cnt = 0;
while (1) {
XNextEvent(display, &event);
/* keyboard events */
if (event.type == KeyPress) {
printf("KeyPress (%ld): %x\n", cnt, event.xkey.keycode);
/* exit on ESC key press */
if (event.xkey.keycode == 0x09)
break;
/* Return */
if (event.xkey.keycode == 0x24) {
printf("Enter\n");
for (int i = 0; i < 10000; i++)
for (int j = 0; j < 40000; j++) {}
}
}
else if (event.type == KeyRelease){
printf("KeyRelease (%ld): %x\n", cnt, event.xkey.keycode);
}
cnt++;
}
/* close connection to server */
XCloseDisplay(display);
return 0;
}
(您可能需要调整机器的循环迭代次数。)这不是说明问题在于Tcl/Tk吗?
我刚刚发现问题只出现在我的联想ThinkPad T530。在我的台式电脑上使用相同的Tk版本和相同的Ubuntu版本(从远程访问),它不会发生。任何想法可以找到问题的想法? – Ralf
Thinkpad上的某个键盘驱动程序变得不快乐了?如果这是针对某些硬件的,那么使用不同的系统配置寻找人(如我!)是很难的...... –
我能够在运行IME时复制问题。关闭IME并且问题消失。所以很可能是某种系统交互。 –