key只能在python中调用一次

时间:2013-12-08 05:01:40

标签: python event-handling tkinter key

我正在尝试使用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] 

如果你看一下渲染功能,我也有我的主文件。是我把输入部分放在哪里。

class main: 

    def __init__(self): 

        self.root = Tk() 
        root = self.root 
        self.root.title("Asteroids") 

        self.width = 500
        self.height = 400 

        root.resizable(width = False, height = False) 

        self.screen = Canvas( root,width = 500, height = 400, background = "black") 
        self.screen.pack() 

        root.after(200, self.render) 
        root.bind("<Key>", GameKeys.keyDown) 
        root.bind("<KeyRelease>", GameKeys.keyUp) 
        root.mainloop() 

    def render(self): 

        while True: 
            self.screen.delete("all") 

            if GameKeys.isPressed(GameKeys.SPACE): 
                print("SPACE") 

            self.screen.update() 
            #        GameKeys.update() 

            time.sleep(0.01)     



Game = main()

所以我不能让它正确地执行“isPressed”功能。有没有人知道这样做的方法?

1 个答案:

答案 0 :(得分:0)

你的代码不起作用,因为你有一个infinte,sleep循环,永远不会让tkinter有机会处理任何事件。必须允许运行事件循环,以便可以处理事件。

作为一个很好的一般准则,你应该:

  1. 永远不会在GUI的主线程中调用sleep
  2. 从不在GUI的主线程中放置无限循环
  3. 您可以使用after处理屏幕重绘来解决这两个问题:

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