Как получить коды клавиши в Python

Это происходит потому, что во второй итерации цикла, когда «что-то» установлено как exclude_label, вы перезаписываете переменную lists_to_filter.

Однако вы можете сделать это немного более эффективно, используя наборы. Например,

lists_to_filter = [
    ['a', 'exclude'],
    ['b']
]
exclude_set = {'exclude', 'something'}
filters_lists  = [labels_list for labels_list in lists_to_filter if not set(labels_list).intersection(exclude_set)]
print(filters_lists)
8
задан Lucas Gabriel Sánchez 24 February 2009 в 15:03
поделиться

5 ответов

См. tty стандартный модуль. Это позволяет переключаться от значения по умолчанию, ориентированного на строку на (приготовленный) режим в ориентированный на символ (cbreak) режим с tty.setcbreak (sys.stdin). Чтение единственного символа от sys.stdin закончится в следующую нажатую клавишу на клавиатуре (если это сгенерирует код):

import sys
import tty
tty.setcbreak(sys.stdin)
while True:
    print ord(sys.stdin.read(1))

Примечание: решением является Unix (включая Linux) только.

Править: В Windows пробуют msvcrt.getche ()/getwche (). / меня нигде не должен пробовать...


Редактирование 2: Используйте win32 консоль API низкого уровня через ctypes.windll (см. пример в ТАК) с ReadConsoleInput функция. Необходимо отфильтровать нажатия клавиш - e.EventType==KEY_EVENT и ищите e.Event.KeyEvent.wVirtualKeyCode значение. Пример приложения (не в Python, только для понимания) может быть найден по http://www.benryves.com/tutorials/?t=winconsole&c=4.

21
ответ дан 5 December 2019 в 05:13
поделиться

В зависимости от то, что Вы пытаетесь выполнить, возможно, пользуясь библиотекой, такой как pygame, сделало бы то, что Вы хотите. Pygame содержит более усовершенствованную обработку нажатия клавиши, чем обычно доступно со стандартными библиотеками Python.

9
ответ дан 5 December 2019 в 05:13
поделиться

Если необходимо работать в окнах, только необходимо попробовать msvcrt.

0
ответ дан 5 December 2019 в 05:13
поделиться

Вероятно, необходимо будет использовать Tkinter, который является 'стандартным' Python gui и много лет включался с Python.

Решение командной строки, вероятно, не доступно из-за способа, которым данные передают в и из процессов командной строки. Программы GUI (некоторой разновидности или другого) все получают ввод данных пользователем через (возможно перенесенная библиотека) поток событий. Каждое событие будет записью деталей события. Для событий нажатия клавиши рекордное желание может содержать любой код клавиши, битовое поле модифицирующей клавиши или текстовый символ в некотором кодировании. Какие поля, и как их называют, зависят от библиотеки события, Вы звоните.

Программы командной строки получают ввод данных пользователем через символьные потоки. Нет никакого способа поймать данные низшего уровня. Как myroslav объясненный в его сообщении, tty's может быть в приготовленном или сыром режиме, при этом единственная разница - это в режиме с обработкой, терминал обработает (немного), управляющие символы для Вас, как удаляют и входят так, чтобы процесс получил строки входа вместо 1 символа за один раз.

Обработка чего-либо ниже, чем это требует (зависимых от операционной системы) системных вызовов или открывающий устройства посимвольного ввода-вывода в/dev. Стандартная библиотека Python не предоставляет стандартного средства для этого.

3
ответ дан 5 December 2019 в 05:13
поделиться

Очевидный ответ:

someFunction = string.upper

ord('a') != ord('A')                      # 97 != 65
someFunction('a') == someFunction('A')    # a_code == A_code

или, в других (ключевых) словах:

char_from_user = getch().upper() # read a char converting to uppercase
if char == 'Q':
    # quit
    exit = True # or something
elif char in ['A', 'K']:
    do_something()

и т.д...

Вот реализация функции getch, которая работала бы и в Windows и в платформах Linux, на основе этого рецепта:

class _Getch(object):
    """Gets a single character from standard input.  
       Does not echo to the screen."""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

    def __call__(self): 
        return self.impl()

class _GetchUnix(object):
    def __init__(self):
        import tty, sys

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch


class _GetchWindows(object):
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()


getch = _Getch()
0
ответ дан 5 December 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: