Python中的钥匙只能在下降时调用一次

2024-05-16 01:17:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用tkinter在python中制作一个游戏(我真的不想学习pygame的东西),我正在使用键制作一个输入处理器。我在试着区分按键和按键

当按下一个键时,它不断地被调用,而一个按键只调用一次,直到它被释放并再次按下为止。在

numKeys = 7
UP = 0
LEFT = 1
DOWN = 2
RIGHT = 3
ENTER = 4
ESCAPE = 5
SPACE = 6

keys = [False] * numKeys 
keyRegister = 0
keyFlag = False

def keyDown(event): 
    if event.keysym == "Up": 
        setKey(UP, True) 
    if event.keysym == "Left": 
        setKey(LEFT, True) 
    if event.keysym == "Down": 
        setKey(DOWN, True) 
    if event.keysym == "Right": 
        setKey(RIGHT, True) 
    if event.keysym == "Enter": 
        setKey(ENTER, True) 
    if event.keysym == "Escape": 
        setKey(ESCAPE, True) 
    if event.keysym == "space": 
        setKey(SPACE, True) 

    if keyRegister != 0: 
        keyFlag = True
    keyRegister += 1 


def keyUp(event): 
    if event.keysym == "Up": 
        setKey(UP, False) 
    if event.keysym == "Left": 
        setKey(LEFT, False) 
    if event.keysym == "Down": 
        setKey(DOWN, False) 
    if event.keysym == "Right": 
        setKey(RIGHT, False) 
    if event.keysym == "Enter": 
        setKey(ENTER, False) 
    if event.keysym == "Escape": 
        setKey(ESCAPE, False) 
    if event.keysym == "space": 
        setKey(SPACE, False) 

    keyRegister = 0
    keyFlag = False

def update(): 



def setKey(k,b): 
    keys[k] = b 


def isDown(k): 
    return keys[k] 

def isPressed(k): 
    if keyFlag == False: 
        return keys[k] 

我还有我的主文件,如果你看渲染函数。是我把输入部分放在哪里。在

^{pr2}$

所以我不能让它正确地执行“isPressed”函数。有人知道怎么做吗?在


Tags: righteventfalsetrueifdefkeysleft
1条回答
网友
1楼 · 发布于 2024-05-16 01:17:09

你的代码不能工作,因为你有一个infinte休眠循环,它从不给tkinter处理任何事件的机会。必须允许事件循环运行,以便可以处理事件。在

作为一个良好的总体指导方针,您应该:

  1. 永远不要在GUI的主线程中调用sleep
  2. 永远不要在GUI的主线程中放置无限循环

通过使用after处理屏幕重画,可以解决这两个问题:

def render(self):
    self.screen.delete("all")
    if GameKeys.isPressed(GameKeys.SPACE):
        print("SPACE")
    self.screen.update()
    self.after(100, self.render)

相关问题 更多 >