#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. Возможно переполнение выходного буфера клавиатуры, и я предполагаю, что именно это и происходит.