pygame.key 的问题

Problems with pygame.key

我对这段代码有疑问:

import pygame, sys
from pygame.locals import *
def main():
    FPS=30
    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    DISPLAYSURF = pygame.display.set_mode((300,300))
    RED=0
    GREEN=0
    BLUE=0
    LAST=None
    pygame.key.set_repeat(10,100)
    while True:
        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
            if event.type==KEYDOWN:
                if event.key==K_r:
                    print 'RED:',RED
                    RED = input('New value for RED: ')
                    print '='*10,'\n'
                    if RED>255:
                        RED=255
                    if RED<0:
                        RED=0
                    LAST='RED'
                if event.key==K_g:
                    print 'GREEN:',GREEN
                    GREEN = input('New value for GREEN: ')
                    print '='*10,'\n'
                    if GREEN>255:
                        RED=255
                    if GREEN<0:
                        GREEN=0
                    LAST='GREEN'
                if event.key==K_b:
                    print 'BLUE:',BLUE
                    BLUE = input('New value for BLUE: ')
                    print '='*10,'\n'
                    if BLUE>255:
                        BLUE=255
                    if BLUE<0:
                        BLUE=0
                    LAST='BLUE'
                if event.key==K_p:
                    print RED,GREEN,BLUE
                    print '='*10,'\n'
                if event.key==K_m:
                    if LAST=='RED':
                        RED+=1
                    if LAST=='GREEN':
                        GREEN+=1
                    if LAST=='BLUE':
                        BLUE+=1
                if event.key==K_l:
                    if LAST=='RED':
                        RED-=1
                    if LAST=='GREEN':
                        GREEN-=1
                    if LAST=='BLUE':
                        BLUE-=1
                if event.key==K_i:
                    print 'Last modified is:',LAST
                    print '='*10,'\n'
        DISPLAYSURF.fill((RED,GREEN,BLUE))
        pygame.display.flip()
        FPSCLOCK.tick(FPS)
main()

对我来说只是一个玩颜色的笨工具(我知道网上有很多,但我想自己写)。 在我的 Mac 上,除了评估 event.key==K_m 的部分外,一切正常。似乎这个事件被忽略了,当我按下 m 时什么也没有发生。我做错了什么?

编辑:我会尝试重新安装 python 和 pygame,我会 post 会发生什么...

更新:从 K_m 更改为 K_h,一切正常。然后我的键盘上的 m 键或 pygame 键有问题。我会再尝试一些,如果我找不到任何新的东西,就关闭这个问题。

坏消息:重新安装了 Python 2.7 32 位(64 位与 pygame 不兼容)并重新安装了 pygame 1.9.1。结果:什么都没有改变。 K_m 无论如何都不起作用。我认为我的电脑有问题。感谢那些花了一些时间思考解决方案的人,我希望我能找到一个...... 再次感谢,祝大家工作愉快!

今天晚上我尝试使用这个代码

import pygame, sys, os
import numpy as np
from pygame.locals import *

FPS=30
WHITE = (255,255,255)
BLACK = (  0,  0,  0)
RED   = (255,  0,  0)
GREEN = (  0,255,  0)
BLUE  = (  0,  0,255)

def main():
    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    DISPLAYSURF = pygame.display.set_mode((300,300))
    while True:
        for event in pygame.event.get():
            if event.type==KEYDOWN or event.type==KEYUP:
                print event
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
            if event.type==KEYDOWN and event.key==K_g:
                DISPLAYSURF.fill(GREEN)
            if event.type==KEYDOWN and event.key==K_r:
                DISPLAYSURF.fill(RED)
            if event.type==KEYDOWN and event.key==K_b:
                DISPLAYSURF.fill(BLUE)
            if event.type==KEYDOWN and event.key==K_m:
                DISPLAYSURF.fill(WHITE)
        pygame.display.flip()
        FPSCLOCK.tick(FPS)

main()

m 键不起作用等... 按 m 只会 return

<Event(2-KeyDown {'scancode': 46, 'key': 44, 'unicode': u'm', 'mod': 0})>
<Event(3-KeyUp {'scancode': 46, 'key': 44, 'mod': 0})>

但没有改变任何东西。 天知道为什么我决定将 event.key==K_m 更改为 event.unicode==u'm' 并且代码成功了!我真的很惊讶,我将 event.unicode==u'm' 更改为 event.key==44 并且成功了! 我真的不明白为什么会这样,但它确实有效,这对我来说很重要。我希望这个解决方案可以帮助其他有类似错误的人! 我现在到处都在使用event.unicode,这比找到每个字符的键号更容易。

工作代码

import pygame, sys, os
import numpy as np
from pygame.locals import *

FPS=30
WHITE = (255,255,255)
BLACK = (  0,  0,  0)
RED   = (255,  0,  0)
GREEN = (  0,255,  0)
BLUE  = (  0,  0,255)

def main():
    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    DISPLAYSURF = pygame.display.set_mode((300,300))
    while True:
        for event in pygame.event.get():
            if event.type==KEYDOWN or event.type==KEYUP:
                print event
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
            if event.type==KEYDOWN and event.key==K_g:
                DISPLAYSURF.fill(GREEN)
            if event.type==KEYDOWN and event.key==K_r:
                DISPLAYSURF.fill(RED)
            if event.type==KEYDOWN and event.key==K_b:
                DISPLAYSURF.fill(BLUE)
            if event.type==KEYDOWN and event.unicode==u'm':
                DISPLAYSURF.fill(WHITE)
        pygame.display.flip()
        FPSCLOCK.tick(FPS)

main()

import pygame, sys, os
import numpy as np
from pygame.locals import *

FPS=30
WHITE = (255,255,255)
BLACK = (  0,  0,  0)
RED   = (255,  0,  0)
GREEN = (  0,255,  0)
BLUE  = (  0,  0,255)

def main():
    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    DISPLAYSURF = pygame.display.set_mode((300,300))
    while True:
        for event in pygame.event.get():
            if event.type==KEYDOWN or event.type==KEYUP:
                print event
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
            if event.type==KEYDOWN and event.key==K_g:
                DISPLAYSURF.fill(GREEN)
            if event.type==KEYDOWN and event.key==K_r:
                DISPLAYSURF.fill(RED)
            if event.type==KEYDOWN and event.key==K_b:
                DISPLAYSURF.fill(BLUE)
            if event.type==KEYDOWN and event.key==44:
                DISPLAYSURF.fill(WHITE)
        pygame.display.flip()
        FPSCLOCK.tick(FPS)

main()