Как сделать так, чтобы Tkinter KeyRelease Event последовательно предоставлял заглавные буквы? - PullRequest
1 голос
/ 29 января 2012

Когда я пытаюсь использовать событие KeyRelease в виджете Tkinter Text, оно иногда предоставляет строчный символ в event.char, но отображает заглавный символ в текстовом виджете. Это происходит, когда я слегка и быстро нажимаю кнопку переключения, а затем букву. Как надежно зафиксировать правильно введенный символ с помощью события KeyRelease в виджете Tkinter Text?

Вот пример кода, который я тестировал на своем 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 ]

3 голосов
/ 29 января 2012

То, что происходит, - это то, что вы отпускаете клавишу Shift перед буквенной клавишей. Сдвиг нажимается во время вставки символа, поэтому виджет получает заглавные буквы, но к тому времени, когда обрабатывается привязка освобождения клавиш, сдвиг уже освобождается, поэтому вы видите строчные буквы.

Если вы хотите напечатать то, что вставлено, привязывайте к нажатию клавиши вместо выпуска.

0 голосов
/ 29 января 2012

Основываясь на понимании Брайана, я изменил код, и он, кажется, работает:

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())
...