在pygame中获取键盘输入

时间:2014-10-23 00:36:50

标签: python pygame keyboard-events

我一直在寻找并尝试解决这个问题几个小时。我有两个脚本,一个标记为main.py,另一个标记为menu.py.我试图使用main.py中的变量来控制menu.py的操作。该变量设置为最后一个键盘输入,在main.py脚本中,它执行它应该执行的操作。但是,当我尝试在menu.py中执行此操作时,没有任何反应,不会抛出错误,我尝试使用的原始动画也不会发生。我省略了部分代码,我认为这些部分不是问题的一部分,因此更容易阅读。

main.py代码:

#!/usr/bin/env python

WIDTH = 512
HEIGHT = 416
FPS = 20
VERSION = "0.0.3"
FULLSCREEN = False

import pygame,sys,os,time

pygame.init()
display = pygame.display.set_mode((WIDTH,HEIGHT), pygame.DOUBLEBUF)

alpha_display = display.convert_alpha()
fpsClock = pygame.time.Clock()
keyPressed = 0

sys.path.insert(0, "scripts/")
from pygame.locals import *
from media import *
import color
import menu

def run():
    display.fill(color.BLACK)

    if (menu.active == True):
        menu.update()

    else:
        pass

while (True): # Code to run loop
    for event in pygame.event.get():
        if (event.type == QUIT):
            pygame.quit()
            sys.exit()

        if (event.type == pygame.KEYDOWN):
            time.sleep(0.1)
            keyPressed = event.key
        elif (event.type == pygame.KEYUP):
            keyPressed = 0

    run()
    pygame.display.update()
    fpsClock.tick(FPS)

menu.py代码:

from __main__ import *

page = "main"
selObj = 1
active = True

class o:
    dee = False
def update():
    if o.dee == False:
        o.dee = True
        global page
        global selObj
        global active

    if page == "main": # Main menu
        if (keyPressed == pygame.K_RETURN):
            if (selObj == 1):
                page = "singleplayer"
            elif (selObj == 2):
                pygame.quit()
                sys.exit()
        if (keyPressed == pygame.K_UP):
            selObj -= 1
        elif (keyPressed == pygame.K_DOWN):
            selObj += 1

        if (selObj >= 3):
            selObj = 1
        elif (selObj <= 0):
            selObj = 2

        if (selObj == 1):
            print("test1"
        elif (selObj == 2):
            print("test2")

1 个答案:

答案 0 :(得分:0)

我相信我找到了你的问题。您正在update()函数中查找pygame事件(使用keypressed),但您从未在pygame事件循环中调用该函数。我不知道你遗漏的行中的某个地方是否初始化keyPressed,但是从我看到的你没有(这应该引发ValueError异常)。如果您在menu.py文件中初始化keyPressed,则不会将更改后的值从main.py传输到menu.py.我建议修复的方法是在事件循环中调用menu.update()并将keyPressed作为参数。

from __main__ import *

page = "main"
selObj = 1
active = True

class o:
    dee = False
def update(keyPressed):#<----#
    if o.dee == False:
        o.dee = True
        global page
        global selObj
        global active

    if page == "main": # Main menu
        if (keyPressed == pygame.K_RETURN):
...

并在主文件中:

    ... 
def run():
    display.fill(color.BLACK)

    if (menu.active == True):
        menu.update(keyPressed)#<-------#

    else:
        pass   
    while (True): # Code to run loop
            for event in pygame.event.get():
                if (event.type == QUIT):
                    pygame.quit()
                    sys.exit()

                if (event.type == pygame.KEYDOWN):
                    time.sleep(0.1)
                    keyPressed = event.key
                elif (event.type == pygame.KEYUP):
                    keyPressed = 0
                menu.update(keyPressed)#<----#
            run()
            pygame.display.update()
            fpsClock.tick(FPS)
    ...

您可能需要进一步修改代码,以确保每次鼠标移动时菜单都不会重置。 希望这有帮助。