Я делаю калькулятор с Pygame и хочу проверить, нажал ли пользователь клавишу, которая является целым числом. Если ключ представляет собой целое число, например 1 или 2, выведите число на экран. Я пытался, но много раз, но потерпел неудачу

Вот мой код

import pygame, math

pygame.init()
screen_width = 1200
screen_height = 500
gameWindow = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('Calculator')
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
white = (255, 255, 255)
black = (0, 0, 0)
grey = (128, 128, 128)
font = pygame.font.SysFont('comicsans', 40)
fps = 60
clock = pygame.time.Clock()

def text_screen(text, color, x, y):
     screen_text = font.render(text, True, color)
     gameWindow.blit(screen_text, [x ,y])

def welcome_screen(run):
    clock.tick(fps) 
    gameWindow.fill(grey)
    while not run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                 run = True
            if event.type == pygame.KEYDOWN:
                if event.key == # Code to check whether the key is integer or not:
                     pass
        pygame.display.update()

def gameLoop(run):
    clock.tick(fps)
    gameWindow.fill(grey)
    while not run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = True
        pygame.display.update()

if __name__ == "__main__":
    welcome_screen(False)
0
Debarka Naskar 15 Янв 2022 в 15:00

4 ответа

Лучший ответ

Вы можете преобразовать код клавиши в представляющий символ, а затем проверить, является ли это цифрой с помощью isdigit().

if event.type == pygame.KEYDOWN:
    if pygame.key.name(event.key).isdigit():
        pass # Do stuff
3
Robiot 15 Янв 2022 в 15:09
1
Этот код выглядит круто. Спасибо!
 – 
Debarka Naskar
15 Янв 2022 в 15:11
Как я могу сохранить номер где-то. Например, когда пользователь нажимает клавишу, например 1 или 2. Тогда, если я хочу показать это на экране, как я могу?
 – 
Debarka Naskar
15 Янв 2022 в 15:21
1
key = pygame.key.name(event.key) if key.isdigit(): text_screen(key, (0, 0, 0), 0, 0) Это не перезапишет последний ключ, поэтому вам нужно найти способ сделать это.
 – 
Robiot
15 Янв 2022 в 15:31
Большое спасибо! Ты спас жизнь.
 – 
Debarka Naskar
15 Янв 2022 в 15:36

Вы можете использовать модуль keyboard и привязать событие нажатия клавиши к функции:

import keyboard  # using module keyboard

def myonkeypress(event):
    if event.name.isnumeric() :
       print('User pressed numeric key')

# hook event handler
keyboard.on_press(myonkeypress)
0
Sy Ker 15 Янв 2022 в 15:09
Этот модуль встроен или мне нужно установить его с помощью pip?
 – 
Debarka Naskar
15 Янв 2022 в 15:09
Вам придется установить его.
 – 
Sy Ker
15 Янв 2022 в 15:11

Я никогда не работал с pygame, но есть встроенная функция Python, которая может вам помочь: isinstance(). (Документы: https://docs.python.org/3.9/library/functions .html#экземпляр)

Он проверяет, является ли данный объект str, int и т. д. Возвращает True или False. Это работает следующим образом:

x = 5
if isinstance(x, int):
    do_this()

Тем не менее, есть одна загвоздка: хотя я никогда не использовал pygame, я прочитал его документы ( http://www.pygame.org/docs/ref/key.html). В нем говорится следующее:

Целые числа для ключевых констант различаются между pygame 1 и 2. Всегда используйте ключевые константы (K_a), а не целые числа напрямую (97), чтобы ваш код обработки ключей хорошо работал как в pygame 1, так и в pygame 2.

Поэтому я думаю, вам лучше использовать что-то отличное от isinstance(). Что-то типа:

[...]
def welcome_screen(run):
    clock.tick(fps) 
    gameWindow.fill(grey)
    while not run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                 run = True
            if event.type == pygame.KEYDOWN:
                if event.key in [pygame.K_1, pygame.K_2]:
                     pass
        pygame.display.update()

0
Dharman 15 Янв 2022 в 15:33
Можете ли вы сказать мне, как сохранить число в переменной или что-то в этом роде?
 – 
Debarka Naskar
15 Янв 2022 в 15:31

Чтобы получить числовой ключ, я предлагаю сначала проверить, не была ли нажата никакая модифицирующая клавиша. Например, если мы нажмем SHIFT + 1, в зависимости от вашей клавиатуры, вы, вероятно, получите восклицательный знак (!), а не реальную цифру 1.

Для того, чтобы это сделать, а также получить целочисленное значение нажатой клавиши, мы можем сделать следующее:

if event.type == pygame.KEYDOWN:
    # Check if no modifier keys are pressed (for example: SHIFT):
    if event.mod == pygame.KMOD_NONE:
        # event.key returns the ASCII code of the key, we can find out if it is numeric by checking if
        # the ASCII value of the key is between the ASCII value of '0' and '9'
        if pygame.K_0 <= event.key <= pygame.K_9:
            # Store the pressed key into a variable
            pressed_digit = event.key - pygame.K_0
            # Do something with it
            print(f'Key pressed: {pressed_digit}')
0
Ervin Szilagyi 15 Янв 2022 в 15:34