在python中,键只在关闭时调用一次

在python中,键只在关闭时调用一次,python,event-handling,tkinter,key,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 =

我正在尝试用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()
主类:
定义初始化(自):
self.root=Tk()
root=self.root
self.root.title(“小行星”)
自宽=500
自身高度=400
根。可调整大小(宽度=假,高度=假)
self.screen=Canvas(根,宽度=500,高度=400,背景=“黑色”)
self.screen.pack()
root.after(200,self.render)
root.bind(“,GameKeys.keyDown)
root.bind(“,GameKeys.keyUp)
root.mainloop()
def渲染(自):
尽管如此:
self.screen.delete(“全部”)
如果GameKeys.isPressed(GameKeys.SPACE):
打印(“空间”)
self.screen.update()
#GameKeys.update()
睡眠时间(0.01)
游戏=main()

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

您的代码不起作用,因为您有一个infinte、sleeping循环,从来没有给tkinter处理任何事件的机会。必须允许事件循环运行,才能处理事件

作为一个好的一般指南,您应该:

  • 不要在GUI的主线程中调用sleep
  • 不要在GUI的主线程中放置无限循环
  • 您可以通过在之后使用
    来处理屏幕重画来解决这两个问题:

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