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:无重复延迟的键盘输入的主要内容,如果未能解决你的问题,请参考以下文章

无符号字符上的键盘输入?

OpenGL/GLFW/GLM - 键盘输入无响应

触发所有移动设备输入文本的数字键盘[重复]

在python中,应如何捕获用户键盘输入?

从键盘读取输入而不按回车[重复]

python 从键盘输入a、b两个数,按大小顺序输出它们