Как связать ТОЛЬКО ключи ASCII в tkinter?

Я хочу связать только ключи ASCII с помощью tkinter. Я знаю, как привязать его выборочно (для каждой клавиши) или даже привязать его ко всем клавишам клавиатуры (используя <Key> или <KeyPress>), но проблема в том, что я не знаю, как сделать то же самое для каждой клавиши ASCII.

Вот что я пробовал до сих пор:

  1. Использование привязки <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()
  1. Использование привязки для каждой клавиши (сначала нужно знать имя/keysym, как показано в документации tkinter):
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? (без стороннего модуля, если возможно)

Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
2
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На мой взгляд, самым простым и эффективным решением для привязки только 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()

Другие вопросы по теме