Ключи Pygame без заглавной буквы - PullRequest
0 голосов
/ 31 октября 2018

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

words = []
class Input:

    def keys(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    if event.key == pygame.K_LSHIFT:
                        words.append("A")
                    else:
                        words.append("a")

    def TextBox(self, surface, BoxColor, TextColor, Text, x,y,w,h):
        font = pygame.font.SysFont("Arial", 20)
        pygame.draw.rect(surface, BoxColor, (x,y,w,h))
        word = "".join(words)
        text(surface, word, TextColor, font, x,y,w,h)
        self.keys(self)

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы также можете просто добавить атрибут event.unicode.

import string
import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
CHARACTERS = set(string.ascii_letters+string.digits+string.punctuation)
print(CHARACTERS)
words = []

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True
        elif event.type == pg.KEYDOWN:
            if event.unicode in CHARACTERS:
                words.append(event.unicode)
                print(''.join(words))

    screen.fill(BG_COLOR)
    pg.display.flip()
    clock.tick(60)

pg.quit()
0 голосов
/ 31 октября 2018

Каждое нажатие клавиши генерирует одно событие, поэтому нажатие клавиши shift и a генерирует два разных события.

Посмотрите внимательно на ваш код:

if event.key == pygame.K_a:
    if event.key == pygame.K_LSHIFT:

event.key не может быть pygame.K_a и pygame.K_LSHIFT одновременно.


Чтобы решить вашу проблему, взгляните на pygame.key.get_mods:

pygame.key.get_mods ()
определить, какие клавиши-модификаторы удерживаются
get_mods() -> int

Возвращает одно целое число, представляющее битовую маску всех удерживаемых клавиш-модификаторов. Используя побитовые операторы, вы можете проверить нажаты определенные клавиши Shift, состояние кнопки Capslock и больше.

Так что ваш код, вероятно, должен выглядеть так (вы поймете идею):

        if event.type == pygame.KEYDOWN:
            mods = pygame.key.get_mods()
            if event.key == pygame.K_a:
                if mods & pygame.KMOD_LSHIFT or mods & pygame.KMOD_CAPS:
                    words.append("A")
                else:
                    words.append("a")

Но я думаю, вы не хотите создавать блок if для каждого возможного ключа, поэтому вы, возможно, захотите использовать pygame.key.name() или pygame.KEYDOWN.unicode, чтобы прочитать письмо непосредственно из события ,

Взгляните на Есть ли какой-нибудь простой способ найти букву / цифру ЛЮБОГО буквенно-цифрового нажатия?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...