可以获取大写键盘输入的Pygame程序
我有一个用Pygame写的程序,需要输入文本。这个程序的工作方式是获取键盘输入,当按下一个键时,它会把这个键的内容显示在屏幕上。简单来说,它就像一个文本框。但是有个问题,当我按住Shift键时,程序没有反应。我发现这是因为程序忽略了Shift键的输入,只在按下的键的ASCII码小于128时才会显示文本。我想过在按下Shift键时设置一个变量,然后根据这个变量来决定是否把字母变成大写,但字符串的大写转换只对字母有效,对数字或分号之类的字符无效。有没有什么方法可以在按下Shift键时,给输入的ASCII码加上一个数字,或者其他什么办法?
补充:
其实,我只是想知道有没有一个数字可以加到ASCII字符上,让它看起来像是按住Shift键输入的。读完我最初的问题后,觉得表达得有点模糊。
5 个回答
1
我研究了一下这个问题。在pygame中,每一个键盘事件不仅有一个扫描码(scancode),还有一个Unicode表示。这不仅可以输入大写字母,还能支持多语言键盘的语言切换。
下面是一个简单的'输入/打印'示例,适用于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)
1
把这个类加到你的代码里就可以了。要获取用户按下的字符,可以调用这个类里的 getCharacter 函数。你可以修改 if keyPress >= 32 和 keyPress <= 126 的判断语句,这样就能让非字母字符在按住 shift 键时也能正常工作。
# 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
3
我可以使用 'event.unicode' 这个属性来获取按下的键的值。