【问题标题】:How do I make Tkinter KeyRelease Event consistently provide uppercase letters?如何使 Tkinter KeyRelease 事件始终提供大写字母?
【发布时间】:2012-01-29 01:56:07
【问题描述】:

当我尝试在 Tkinter Text 小部件上使用 KeyRelease 事件时,它有时会在 event.char 中提供一个小写字符,但在文本小部件中显示一个大写字符。当我轻而快地按下 shift 按钮,然后按下一个字母时,就会发生这种情况。如何使用 Tkinter Text 小部件上的 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())

【问题讨论】:

    标签: python tkinter keyboard-events uppercase


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      根据 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())
      

      【讨论】:

        猜你喜欢
        • 2011-10-26
        • 1970-01-01
        • 2020-09-15
        • 1970-01-01
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 2013-02-04
        相关资源
        最近更新 更多