Посмотрите на модуль curses. Он находится в стандартной библиотеке Python, но не поддерживает окна из коробки.
Существует регулярно поддерживаемый проект под названием «Windows-Curses», который вы можете посмотреть. Я не проверял его, но он предположительно позволит вам использовать модуль python curses на Windows.
https://pypi.org/project/windows-curses/
import curses
def listen(window):
while True:
key = window.getch()
window.addstr(f'You pressed the "{key}" key!\n')
if key == 'q':
break
handle_keypress(key)
curses.wrapper(listen)
Если подход с использованием curses не работает для вас, или вам все еще нужна дополнительная детализация, вы можете довольно легко развернуть свой собственный кроссплатформенный подход. Вы можете попробовать что-то вроде этого:
from sys import platform
class Keyboard:
def __new__(cls):
if platform in ['Windows', 'win32', 'cygwin']:
cls = winKeyboard
elif platform in ['Mac', 'darwin', 'os2', 'os2emx']:
cls = MacKeyboard
else:
raise Exception(f'Unrecognized platform, {platform}')
return super(Keyboard, cls).__new__(cls)
def listen(self):
while True:
key = self.getch()
print(f'You pressed the "{key}" key!')
if key == 27:
break
return self.handle_key(key)
class MacKeyboard(Keyboard):
def getch(self):
implement_mac_logic()
class WinKeyboard(Keyboard):
def getch(self):
implement_win_logic()
keyboard = Keyboard()
keyboard.listen()
Клавиатура .__ new__ выполняет работу по предоставлению соответствующего решения во время выполнения для текущей операционной системы.
Этот подход по-прежнему регистрирует нажатия клавиш независимо от активного окна.
Для этого вам понадобится доступ к активному окну, что будет другой специфической для ОС процедурой.
Посмотрите на это: https://stackoverflow.com/a/36419702/1420455
Вы могли бы реализовать функцию, которая проверяла имя текущего окна
class Keyboard:
...
def listen(self):
while True:
if self.get_active_window() != desired_window:
continue
key = self.getch()
print(f'You pressed the "{key}" key!')
if key == 27:
break
return self.handle_key(key)
Тогда вы можете просто реализовать логику согласования в WinKeyboard.get_active_window и MacKeyboard.get_active_window
Это не учитывает нахождение в разных вкладках. Это может быть возможно, но я недостаточно знаком с API, чтобы рассказать вам.
Существуют также такие параметры, как pygame, которые потребуют от вас создания и управления собственными окнами, но будут соответствовать вашим требованиям.
Редактировать: Изменены WinKeyboard и MacKeyboard для наследования от клавиатуры.