Ввод Num Pad для Pygame?

Я использую цифровую клавиатуру с pygame, и цифровая клавиатура не распознается.

Я знаю, что мне нужно использовать приведенный ниже код, но не как:

if (event.key >= 0x100 and event.key <= 0x109)

Вот мой код для использования ключа return:

if event.type == KEYDOWN and event.key != 300:
        if (event.key >= 0x100 and event.key <= 0x109 and event.key == pygame.K_RETURN):
....

Кто-нибудь может помочь?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 177
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Если вы хотите проверить, была ли нажата клавиша на клавиатуре, вы можете использовать следующую константы;

K_KP0                 keypad 0
K_KP1                 keypad 1
K_KP2                 keypad 2
K_KP3                 keypad 3
K_KP4                 keypad 4
K_KP5                 keypad 5
K_KP6                 keypad 6
K_KP7                 keypad 7
K_KP8                 keypad 8
K_KP9                 keypad 9
K_KP_PERIOD   .       keypad period
K_KP_DIVIDE   /       keypad divide
K_KP_MULTIPLY *       keypad multiply
K_KP_MINUS    -       keypad minus
K_KP_PLUS     +       keypad plus
K_KP_ENTER    \r      keypad enter
K_KP_EQUALS   =       keypad equals

Вы должны использовать event.key >= 0x100 and event.key <= 0x109 для проверки K_KP0, K_KP1, ... K_KP9, потому что K_KP0 — это 256 в десятичном формате и 0x100 в шестнадцатеричном формате, K_KP9 — это 265 в десятичном формате, 0x109 в шестнадцатеричном формате и т. д.

Кроме того, для удобочитаемости было бы лучше использовать константы вместо шестнадцатеричных литералов.

Вот простой пример того, как проверить все номера клавиатуры или клавишу возврата на клавиатуре:

import pygame

screen = pygame.display.set_mode((300, 300))

while True:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            quit()
        if e.type == pygame.KEYDOWN:
            if pygame.K_KP0 <= e.key <= pygame.K_KP9:
                print('Numpad 0-9')
            if e.key == pygame.K_KP_ENTER:
                print('Numpad ENTER')

Ваш код

 if (event.key >= 0x100 and event.key <= 0x109 and event.key == pygame.K_RETURN):

не будет работать, потому что event.key не может быть больше 256, меньше 265 и одновременно равен 13 (K_RETURN есть 13).

Проверка фактического диапазона числовых значений сводит на нет весь смысл использования символических констант... поэтому я не думаю, что это хороший совет.

martineau 18.01.2019 08:54

@martineau Это не мой совет, но, конечно, я с вами согласен; это совершенно верно. Я обновил свой ответ.

sloth 18.01.2019 09:04

Проверка e.key >= pygame.K_KP0 and e.key <= pygame.K_KP9 на самом деле не намного лучше.

martineau 18.01.2019 09:12

@sloth: Это работает хорошо. Я хотел бы спросить: K_KP_ENTER работает для кнопки ввода на цифровой клавиатуре, а K_RETURN - для кнопки ввода на длинной клавиатуре. Есть ли этому объяснение?

ddd 18.01.2019 14:54

@ddd Простой ответ заключается в том, что ваша клавиатура посылает разные сигналы на ваш компьютер, если вы нажимаете обычную клавишу ввода или клавишу ввода цифровой клавиатуры.

sloth 18.01.2019 15:04

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

Что-то вроде этого:

from pygame.locals import *

NUMPAD_KEYS = {K_KP0, K_KP1, K_KP2, K_KP3, K_KP4, K_KP5, K_KP6, K_KP7, K_KP8, K_KP9}

if event.key in NUMPAD_KEYS:
    # Do something...

Я не думаю, что вы что-то выиграете, используя сет. Не случайно константы упорядочены. Это все равно, что сказать, что вы должны использовать регулярное выражение [a|b|c|d|e|f|g|h|i|j] вместо простого [a-j].

sloth 18.01.2019 10:38

@sloth: вы упускаете главное: не только то, что тестирование членства в них выполняется быстро — хотя это и приятно — но и то, что их использование позволяет вам писать код, независимый от фактических числовых значений или их отношения к одному другой (например, один больше или меньше другого).

martineau 18.01.2019 10:43

Я понимаю вашу точку зрения. Во-первых, чтобы заметить даже небольшую разницу между x in {...} и a < x < b, вам придется вызвать код 10000000 раз, так что это явно не проблема. Вероятно, вы могли бы повысить производительность, кэшируя поиск атрибутов и помещая свой код в функцию, чтобы минимизировать глобальные поиски.

sloth 18.01.2019 11:15

Во-вторых, я бы согласился, если бы мы говорили о произвольных переменных в произвольном контексте, но в данном случае связь между константами разумна и очевидна (0 до 1 до 2, a до b до c), и никогда не будет самопроизвольно изменять. Я просто не вижу смысла в том, чтобы быть независимым от того факта, что K_a меньше, чем K_b, потому что он хорошо определен. И, используя что-то K_a < event.key < K_z, вы также не зависите от фактического числового значения.

sloth 18.01.2019 11:16

@sloth: Использование чего-то вроде K_a < event.key < K_z предполагает, что K_a меньше, чем K_z. Я также думаю, что ваше отрицательное голосование совершенно неоправданно (и, вероятно, просто мстительно, а не логично). Расти!

martineau 18.01.2019 11:21

@martineauI Я не согласен с вами по этой теме, но я не думаю, что ваш ответ заслуживает отрицательного голоса; Я не минусовал твой ответ.

sloth 18.01.2019 13:07

@sloth: Мои извинения за обвинение. Думаю, мы можем согласиться не соглашаться... хотя это действительно иллюстрирует, почему не следует делать предположений.

martineau 18.01.2019 13:39

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