Программа Pygame, которая может вводить ввод с клавиатуры с помощью заглавных букв

У меня есть программа Pygame, которой требуется ввод текста. Это делается для того, чтобы получить ввод с клавиатуры, и при нажатии клавиши он отображает эту клавишу, поэтому она добавляется на экран. По сути, он действует как текстовое поле. Проблема в том, что когда вы держите Shift, он ничего не делает. Я понимаю, что это связано с тем, что программа игнорирует ввод сдвига и вместо этого записывает текст, если его число меньше 128. Я думал установить переменную при нажатии сдвига, а затем использовать заглавные буквы, если это было правдой, но капитализация строк работает только с буквами, а не с вещами как числа или точки с запятой. Может быть, есть число, которое я могу добавить к введенному номеру ASCII, чтобы изменить его, если нажат Shift, или что-то еще?
Редактировать:
По сути, я просто хочу знать, если есть число, которое нужно добавить к символам ascii, чтобы казалось, что они были напечатаны с зажатым сдвигом. После прочтения моего первоначального вопроса он показался немного неясным.


person None    schedule 19.04.2010    source источник
comment
«Число для добавления к символам ascii» — 32. Добавление 32 к 'a' даст вам 'A'. Тем не менее, вы все равно должны попытаться заставить свою клавишу Shift работать. Pygame довольно хорошо распознает изменяющие ключи. Это реальная проблема, которую вы должны решить.   -  person Xavier Ho    schedule 22.04.2010
comment
Это не имеет ничего общего с моим ключом. Я думаю, что тот факт, что у pygame нет pygame.K_A, только pygame.K_a, является достаточным доказательством, если это так. Он не распознает сдвиг при нажатии a. Я знаю это точно.   -  person None    schedule 23.04.2010
comment
Я был неправ. Прости, Ксавьер. Я не знал об атрибуте event.unicode. Знайте, что я делаю, все работает нормально.   -  person None    schedule 23.04.2010


Ответы (5)


Я могу использовать атрибут event.unicode, чтобы получить значение введенного ключа.

person None    schedule 07.05.2010

Добавление этого класса в ваш код должно помочь. Чтобы получить символ, который нажимает пользователь, вызовите функцию getCharacter из класса. Вы можете изменить оператор if keyPress >= 32 и keyPress ‹= 126:, чтобы разрешить небуквенным символам работать со сдвигом.

# The pygame module itself...
import pygame

class controls:

    def getKeyPress(self):
      for event in pygame.event.get():
         if event.type == KEYDOWN:    
             return event.key
         else:
             return False


    def getCharacter(self):

      # Check to see if the player has inputed a command
      keyinput = pygame.key.get_pressed()  

      character = "NULL"

      # Get all "Events" that have occurred.
      pygame.event.pump()
      keyPress = self.getKeyPress()

      #If the user presses a key on the keyboard then get the character
      if keyPress >= 32 and keyPress <= 126:
      #If the user presses the shift key while pressing another character then capitalise it
          if keyinput[K_LSHIFT]: 
              keyPress -= 32

          character = chr(keyPress)

      return character 
person apocolyp4    schedule 27.04.2010

копаюсь в этом вопросе. Каждое событие клавиатуры в pygame имеет не только скан-код, но и представление в юникоде. Которые не только позволяют вводить заглавные буквы, но и поддерживают многоязычную клавиатуру с переключением языка.

Вот простой пример ввода/вывода для pygame:

#!/usr/bin/python

import pygame

pygame.init()
screen_size=(800,60)
disp=pygame.display.set_mode(screen_size, pygame.DOUBLEBUF)
msg=u""
clock=pygame.time.Clock()
default_font=pygame.font.get_default_font()
font=pygame.font.SysFont(default_font,16)

disp.fill((240,240,240,255))
pygame.display.flip()
while(not pygame.event.pump()):
    for event in pygame.event.get():
        print event
        if event.type == pygame.QUIT:
            pygame.quit()
            break
        if event.type == pygame.KEYDOWN:
            msg+=event.unicode
            disp.fill((240,240,240,255))
            disp.blit(font.render(msg,True,(30,30,30,255)),(0,0))
            pygame.display.flip()
    clock.tick(24)
person George Shuklin    schedule 08.12.2013

Похоже, что вычитание 32 должно дать вам то, что вы хотите, глядя на таблицу ASCII. Сначала убедитесь, что вы действительно имеете дело со строчной буквой, иначе вы получите странные символы. Я не уверен, что вы имеете в виду, что заглавные буквы работают только с буквами:

>>> '1234;!@#abcd'.upper()
'1234;!@#ABCD'
person jrdioko    schedule 20.04.2010
comment
В вашем примере меняются только символы abcd. Это то, что я имел в виду. - person None; 20.04.2010
comment
Я попробовал это, и это работало для букв, но это не то, что я хотел, потому что он выдавал странные символы, когда что-то еще было напечатано. Я хочу преобразование, которое действует как клавиша Shift, когда она меняет буквы. Есть ли способ получить это? - person None; 20.04.2010
comment
Например, вот какой-то псевдокод: если ключ ‹= 127: если не сдвиг: текст += chr(клавиша) иначе: текст += chr(shift(клавиша)) - person None; 20.04.2010
comment
Я все еще не уверен, что понимаю. Если вам нужно что-то, что состоит только из заглавных букв, почему не работает upper()? В какую строку в примере, который я привел, нужно преобразовать в вашем сценарии? - person jrdioko; 20.04.2010
comment
Я не хочу что-то, что только заглавные буквы. Я хочу что-то, что действует как клавиша Shift. - person None; 21.04.2010
comment
Преобразование, которое я хочу, изменит строку на !@##:123ABCD - person None; 21.04.2010
comment
извините, была опечатка. 1234;!@#abcd следует преобразовать в !@#$:123ABCD - person None; 21.04.2010
comment
А теперь я понимаю. Я не уверен, как вы могли это сделать, так как это зависит от раскладки клавиатуры и отображения. - person jrdioko; 21.04.2010
comment
OK. Благодарю. Я понял это и написал свою собственную функцию. - person None; 22.04.2010

Я написал функцию, которая преобразует строки после недостаточной помощи. Он конвертирует все вручную.

person None    schedule 21.04.2010
comment
Мне не нужна эта функция, так как теперь я знаю об атрибуте unicode класса Event pygame. - person None; 23.04.2010