Вам, вероятно, придется использовать Tkinter , который является «стандартным» графическим интерфейсом Python и входит в состав Python уже много лет.
Решение для командной строки, вероятно, недоступно из-за способа передачи данных в процессы командной строки и из них. Все программы с графическим интерфейсом (того или иного вида) получают пользовательский ввод через поток событий (возможно, в виде библиотеки). Каждое событие будет записывать детали события. Для событий нажатия клавиши запись может содержать любой код клавиши, битовое поле ключа модификации или текстовый символ в некоторой кодировке. Какие поля и как они называются, зависят от библиотеки событий, которую вы вызываете.
Программы командной строки получают пользовательский ввод через символьные потоки. Нет способа поймать данные более низкого уровня. Как пояснил Мирослав в своем посте, tty может быть в режиме «приготовлено» или «не готово», единственное отличие состоит в том, что в режиме «приготовлено» терминал будет обрабатывать (некоторые) управляющие символы для вас, такие как удаление и ввод, так что процесс получит строки ввода вместо по 1 персонажу за раз.
Обработка всего, что ниже, требует (в зависимости от ОС) системных вызовов или открытия символьных устройств в / dev. Стандартная библиотека Python не предоставляет для этого стандартного средства.