Я использую цифровую клавиатуру с 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):
....
Кто-нибудь может помочь?






Если вы хотите проверить, была ли нажата клавиша на клавиатуре, вы можете использовать следующую константы;
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 Это не мой совет, но, конечно, я с вами согласен; это совершенно верно. Я обновил свой ответ.
Проверка e.key >= pygame.K_KP0 and e.key <= pygame.K_KP9 на самом деле не намного лучше.
@sloth: Это работает хорошо. Я хотел бы спросить: K_KP_ENTER работает для кнопки ввода на цифровой клавиатуре, а K_RETURN - для кнопки ввода на длинной клавиатуре. Есть ли этому объяснение?
@ddd Простой ответ заключается в том, что ваша клавиатура посылает разные сигналы на ваш компьютер, если вы нажимаете обычную клавишу ввода или клавишу ввода цифровой клавиатуры.
На мой взгляд, лучшим подходом было бы создать 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: вы упускаете главное: не только то, что тестирование членства в них выполняется быстро — хотя это и приятно — но и то, что их использование позволяет вам писать код, независимый от фактических числовых значений или их отношения к одному другой (например, один больше или меньше другого).
Я понимаю вашу точку зрения. Во-первых, чтобы заметить даже небольшую разницу между x in {...} и a < x < b, вам придется вызвать код 10000000 раз, так что это явно не проблема. Вероятно, вы могли бы повысить производительность, кэшируя поиск атрибутов и помещая свой код в функцию, чтобы минимизировать глобальные поиски.
Во-вторых, я бы согласился, если бы мы говорили о произвольных переменных в произвольном контексте, но в данном случае связь между константами разумна и очевидна (0 до 1 до 2, a до b до c), и никогда не будет самопроизвольно изменять. Я просто не вижу смысла в том, чтобы быть независимым от того факта, что K_a меньше, чем K_b, потому что он хорошо определен. И, используя что-то K_a < event.key < K_z, вы также не зависите от фактического числового значения.
@sloth: Использование чего-то вроде K_a < event.key < K_z предполагает, что K_a меньше, чем K_z. Я также думаю, что ваше отрицательное голосование совершенно неоправданно (и, вероятно, просто мстительно, а не логично). Расти!
@martineauI Я не согласен с вами по этой теме, но я не думаю, что ваш ответ заслуживает отрицательного голоса; Я не минусовал твой ответ.
@sloth: Мои извинения за обвинение. Думаю, мы можем согласиться не соглашаться... хотя это действительно иллюстрирует, почему не следует делать предположений.
Проверка фактического диапазона числовых значений сводит на нет весь смысл использования символических констант... поэтому я не думаю, что это хороший совет.