Python:无重复延迟的键盘输入
Posted
技术标签:
【中文标题】Python:无重复延迟的键盘输入【英文标题】:Python: Keyboard input without repeat delay 【发布时间】:2015-09-25 09:37:09 【问题描述】:对于那些不知道的人,重复延迟是在按住一个键时,第一个出现的字母和它重复之间的轻微停顿。这在打字时可能是一个有用的功能,但是当您开始编写游戏时,它变得非常烦人。一个例子是当你需要移动一个角色时;它会移动一点点,暂停,然后再次开始移动。 Tkinter 代码:
ball = canvas.create_rectangle(50, 50, 100, 100)
def move():
canvas.move(ball, 0, 3)
canvas.bind_all("<space>", move)
如果按下空格,小球将向下移动 3 个像素,暂停,然后开始正常移动。我想知道是否有任何方法可以避免这种暂停,例如直接从键盘读取的模块,而不是 Windows 处理的键盘。我知道有可能“作弊”,例如,当您预计会发生延迟时自动运行该功能;可悲的是,这是不准确的,可能会导致不稳定的运动。提前致谢
【问题讨论】:
一般来说,你需要一个按键 press 事件,而不是一个按键 type 事件。您必须自己重复,直到密钥释放发生。这也允许您控制重复率。 @o11c:请注意,您的建议可能不起作用——即使您只是按住键,某些键盘也会自动发送新闻稿事件流。 该问题的解决方案就在这里:***.com/questions/27215326/… 【参考方案1】:在按下时进行递归循环。或者,至少我是这样做的。
moving = False
def move():
global moving
moving = True
def stop_moving():
global moving
moving = False
def myloop():
global moving
if moving == True:
canvas.move(ball, 0, 3)
root.after(1, myloop)
root.bind('<space>', lambda e: move())
root.bind('<KeyRelease-space>', lambda e: stop_moving())
只需确保在 root.mainloop() 之前调用循环一次
#like this
root.after(1, myloop)
root.mainloop()
【讨论】:
以上是关于Python:无重复延迟的键盘输入的主要内容,如果未能解决你的问题,请参考以下文章