我正在尝试使用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”功能。有没有人知道这样做的方法?
答案 0 :(得分:0)
你的代码不起作用,因为你有一个infinte,sleep循环,永远不会让tkinter有机会处理任何事件。必须允许运行事件循环,以便可以处理事件。
作为一个很好的一般准则,你应该:
您可以使用after
处理屏幕重绘来解决这两个问题:
def render(self):
self.screen.delete("all")
if GameKeys.isPressed(GameKeys.SPACE):
print("SPACE")
self.screen.update()
self.after(100, self.render)