Python: обработка событий нажатия и нажатия клавиш (может быть ограничением клавиатуры)

#python #tkinter #event-handling #keyboard-events

Вопрос:

Я хочу обнаружить «аккордирование» клавиш, т. Е. Я хочу знать, какие клавиши нажаты вместе. Потенциально пользователь может нажимать 10 клавиш (по одной для каждого пальца ;o)).

Отправитель в другом месте объяснил основы привязки событий «ключ вверх» и «ключ вниз», что позволило мне добиться хорошего прогресса. Этот код настолько каноничен, насколько я могу его получить:

 from tkinter import *
from tkinter import ttk

class MainUI:
    def __init__(self, root):

        mainframe = Frame(root)
        mainframe.grid(column=0, row=0, sticky=(N, W, E, S))

        self.key_text = StringVar()
        self.key_entry = ttk.Entry(mainframe, width=16, justify=CENTER, textvariable=self.key_text)
        self.key_entry.insert(0,"Click here")
        self.key_entry.grid(column=1, row=1) #, sticky=(W)
        self.key_entry.bind('<KeyPress>', self.keyPressHandler)
        self.key_entry.bind('<KeyRelease>', self.keyReleaseHandler)
        self.keysPressed = [] # List of which keys are currently pressed
        for child in mainframe.winfo_children(): 
            child.grid_configure(padx=5, pady=5)

    def keyPressHandler(self, event):       
        if event.char in self.keysPressed: return # Ignore key repeats: we only want the first keydown event
        else:
            self.keysPressed.append(event.char)
            print("Key down:", event.char)
        
    def keyReleaseHandler(self, event):
        self.keysPressed.remove(event.char)
        print("Key up:", event.char)

root = Tk()
ui = MainUI(root)
root.mainloop()
 

Это почти работает:

  • Он подберет любые две клавиши, нажатые одновременно (например, » g » и «h»).
  • Он подберет несколько клавиш, если клавиши находятся на левом или правом конце клавиатуры (например, «q», «w», «e», «r»).
  • Но он не будет брать несколько клавиш из середины клавиатуры (например, «g», «h», «j»).

Поведение с внешней USB-клавиатурой и встроенной клавиатурой ноутбука аналогично, хотя я не думаю, что они идентичны.

Я предполагаю, что я сталкиваюсь с некоторым ограничением сканирования клавиатуры, и что проблема не имеет ничего общего с Python.

Мысли?

Комментарии:

1. Возможно переполнение выходного буфера клавиатуры, и я предполагаю, что именно это и происходит.