在python中,键只在关闭时调用一次
我正在尝试用tkinter用python制作一个游戏(我真的不想学习pygame的东西),我正在用按键制作一个输入处理器。我正在尝试区分按键按下和按键按下 当按下某个键时,会不断调用向下键,而按下某个键只会调用一次,直到释放并再次按下为止在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 =
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处理任何事件的机会。必须允许事件循环运行,才能处理事件 作为一个好的一般指南,您应该:
来处理屏幕重画来解决这两个问题:
def render(self):
self.screen.delete("all")
if GameKeys.isPressed(GameKeys.SPACE):
print("SPACE")
self.screen.update()
self.after(100, self.render)