如何让Tkinter的KeyRelease事件始终提供大写字母?
当我尝试在Tkinter的文本框中使用KeyRelease事件时,有时候event.char会给我一个小写字母,但文本框里却显示的是大写字母。这种情况发生在我轻轻快速地按下Shift键,然后再按一个字母的时候。我该如何确保在Tkinter文本框的KeyRelease事件中准确捕捉到正确大小写的字母呢?
下面是我在MacBook Pro上测试的示例代码:
from Tkinter import *
class App:
def __init__(self):
# create application window
self.root = Tk()
# add frame to contain widgets
frame = Frame(self.root, width=768, height=576,
padx=20, pady=20, bg="lightgrey")
frame.pack()
# add text widget to contain text typed by the user
self.text = Text(frame, name="typedText", bd="5", wrap=WORD, relief=FLAT)
self.text.bind("<KeyRelease>", self.printKey)
self.text.pack(fill=X)
"""
printKey sometimes prints lowercase letters to the console,
but upper case letters in the text widget,
especially when I lightly and quickly press Shift and then some letter
on my MacBook Pro keyboard
"""
def printKey(self, event):
print event.char
def start(self):
self.root.mainloop()
def main():
a = App()
a.start()
if __name__ == "__main__":
sys.exit(main())
2 个回答
0
根据Bryan的建议,我对代码进行了修改,现在看起来可以正常工作了:
from Tkinter import *
import string
class App:
def __init__(self):
# create application window
self.root = Tk()
# add frame to contain widgets
frame = Frame(self.root, width=768, height=576, padx=20, pady=20, bg="lightgrey")
frame.pack()
# add text widget to contain text typed by the user
self.text = Text(frame, name="typedText", bd="5", wrap=WORD, relief=FLAT)
self.text.bind("<KeyPress>", self.printKey)
self.text.pack(fill=X)
"""
this correctly prints the letters when pressed (and does not print the Shift keys)
"""
def printKey(self, event):
# Adapted from http://www.kosbie.net/cmu/fall-10/15-110/koz/misc-demos/src/keyEventsDemo.py
ignoreSyms = [ "Shift_L", "Shift_R", "Control_L", "Control_R", "Caps_Lock" ]
if event.keysym not in ignoreSyms:
print event.char
def start(self):
self.root.mainloop()
def main():
a = App()
a.start()
if __name__ == "__main__":
sys.exit(main())
3
发生的情况是,你在按下字母键之前就松开了Shift键。Shift键是在字符被输入时按下的,这就是为什么小部件会得到一个大写字母。但是等到你的键松开事件被处理时,Shift键已经松开了,所以你看到的是小写字母。
如果你想打印出正在输入的内容,应该在按下键的时候绑定事件,而不是松开键的时候。