Python 如何使Tkinter KeyRelease事件始终提供大写字母?

Python 如何使Tkinter KeyRelease事件始终提供大写字母?,python,tkinter,keyboard-events,uppercase,Python,Tkinter,Keyboard Events,Uppercase,当我尝试在Tkinter文本小部件上使用KeyRelease事件时,它有时在event.char中提供小写字符,但在文本小部件中显示大写字符。当我轻快地按下shift按钮,然后按下一个字母时,就会出现这种情况。如何在Tkinter文本小部件上通过KeyRelease事件可靠地捕获大小写正确的字符 以下是我在MacBook Pro上测试的示例代码: from Tkinter import * class App: def __init__(self): # creat

当我尝试在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())
从Tkinter导入*
类应用程序:
定义初始化(自):
#创建应用程序窗口
self.root=Tk()
#添加框架以包含小部件
框架=框架(self.root,宽度=768,高度=576,
padx=20,pady=20,bg=“浅灰色”)
frame.pack()
#添加文本小部件以包含用户键入的文本
self.text=text(frame,name=“typedText”,bd=“5”,wrap=WORD,relief=FLAT)
self.text.bind(“,self.printKey)
self.text.pack(fill=X)
"""
printKey有时会将小写字母打印到控制台,
但是文本小部件中的大写字母,
特别是当我轻快地按下Shift键,然后按下一些字母时
在我的MacBook Pro键盘上
"""  
def打印密钥(自身、事件):
打印事件.char
def启动(自):
self.root.mainloop()
def main():
a=应用程序()
a、 开始()
如果名称=“\uuuuu main\uuuuuuuu”:
sys.exit(main())

发生的情况是,在字母键之前释放shift键。在插入字符时按下shift键,这就是小部件获得大写字符的原因,但在处理keyrelease绑定时,shift键已被释放,因此可以看到小写字符


如果要打印插入的内容,请绑定到按键,而不是释放

基于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())
从Tkinter导入*
导入字符串
类应用程序:
定义初始化(自):
#创建应用程序窗口
self.root=Tk()
#添加框架以包含小部件
frame=frame(self.root,宽=768,高=576,padx=20,pady=20,bg=“浅灰色”)
frame.pack()
#添加文本小部件以包含用户键入的文本
self.text=text(frame,name=“typedText”,bd=“5”,wrap=WORD,relief=FLAT)
self.text.bind(“,self.printKey)
self.text.pack(fill=X)
"""
按下此按钮时可正确打印字母(不打印换档键)
"""  
def打印密钥(自身、事件):
#改编自http://www.kosbie.net/cmu/fall-10/15-110/koz/misc-demos/src/keyEventsDemo.py
ignoreSyms=[“移位”、“移位”、“控制”、“控制”、“大写锁定”]
如果event.keysym不在ignoreSyms中:
打印事件.char
def启动(自):
self.root.mainloop()
def main():
a=应用程序()
a、 开始()
如果名称=“\uuuuu main\uuuuuuuu”:
sys.exit(main())