Я хочу связать только ключи ASCII с помощью tkinter. Я знаю, как привязать его выборочно (для каждой клавиши) или даже привязать его ко всем клавишам клавиатуры (используя <Key> или <KeyPress>), но проблема в том, что я не знаю, как сделать то же самое для каждой клавиши ASCII.
Вот что я пробовал до сих пор:
<Key>
или <KeyPress>
для захвата всех клавиш клавиатуры (не поддерживает клавиши мыши):import tkinter as tk
def key_press(event):
label.config(text = f'char Pressed: {event.char!r}')
label2.config(text=f'keysym Pressed: {event.keysym!r}')
root = tk.Tk()
label = tk.Label(root, text='Press a key')
label2 = tk.Label(root, text='Press a key')
label.pack()
label2.pack()
root.bind('<Key>', key_press)
root.mainloop()
import tkinter as tk
def key_press(event):
label.config(text = f'char Pressed: {event.char!r}')
label2.config(text=f'keysym Pressed: {event.keysym!r}')
root = tk.Tk()
label = tk.Label(root, text='Press a key')
label2 = tk.Label(root, text='Press a key')
label.pack()
label2.pack()
# here we only use the K and BackSpace key as example
root.bind('<BackSpace>', key_press)
root.bind('<K>', key_press)
root.mainloop()
Как я могу привязать функцию только ко всем клавишам ascii, используя только tkinter? (без стороннего модуля, если возможно)
На мой взгляд, самым простым и эффективным решением для привязки только ascii-символов является использование event.char. event.char соответствует %A и будет пустой строкой, если не проанализирован ни один печатный символ. Чтобы получить доступ к отдельному персонажу, вы можете использовать repr как это реализовано в tkinter
Я не использовал event.keycode, потому что для Multi_key они кажутся ненадежными. Также включен del-ключ, но не нашел лучшего способа, как использовать keysym для него, не стесняйтесь найти лучший способ
Пример кода:
import tkinter as tk
def isascii(event):
if event.char != '':
char = list(event.char)[0] #'^' or '`' is only parsed as doubles in Windows
if ord(char) <= 127: #avoid non-ascii like '²' or '³' or '´'
print(
repr(char), #printable character
ord(char) #corresponding ascii value
)
elif event.keysym == 'Delete':
print('backspace / delete', 127)
root = tk.Tk()
root.bind('<Key>', isascii)
root.mainloop()
Сжатая версия:
import tkinter as tk
def isascii(event):
if event.char != '' and ord((char := list(event.char)[0])) <= 127:
print(
repr(char), #printable character
ord(char) #corresponding ascii value
)
elif event.keysym == 'Delete': print('delete', 127)
root = tk.Tk()
root.bind('<Key>', isascii)
root.mainloop()