检测键盘按键持续时间的 Python/Pygame 代码

3

在我的程序中,我希望用户能够按住一个按钮。松开按钮时,我希望打印出他们按住键的持续时间。我一直在尝试使用pygame时钟函数,但遇到了一些问题。该程序对于第一个按键操作运行良好,但在后续的按键操作中记录任何按键之间的停机时间。希望有所帮助,这是我的代码:

import pygame
from pygame.locals import *
def main():
    key = 0
    pygame.init()

    self = pygame.time.Clock()

    surface_sz = 480

    main_surface = pygame.display.set_mode((surface_sz, surface_sz))

    small_rect = (300, 200, 150, 90)
    some_color = (255, 0, 0)

    while True:
        ev = pygame.event.poll()

        if ev.type == pygame.QUIT:
            break;
        elif ev.type == KEYUP:
            if ev.key == K_SPACE:       #Sets the key to be used
                key += 1                #Updates counter for number of keypresses
                while ev.type == KEYUP:
                    self.tick_busy_loop()
                    test = (self.get_time()/1000.0)
                    print "number: ", key, "duration: ", test 
                    ev = pygame.event.poll()



main()
2个回答

2
你可以使用 keyboard 库来完成此操作。
以下是我编写的示例代码:
import keyboard, time
while True:
    a = keyboard.read_event()     #Reading the key
    if a.name == "esc":break      #Loop will break on pressing esc, you can remove that
    elif a.event_type == "down":  #If any button is pressed (Not talking about released) then wait for it to be released
        t = time.time()           #Getting time in sec
        b = keyboard.read_event() 
        while not b.event_type == "up" and b.name == a.name:  #Loop till the key event doesn't matches the old one
            b = keyboard.read_event()
        print('Pressed Key "'+ b.name + '" for ' + str(time.time()-t))

如果您正在寻找更多解决方案(针对PygamePynput),那么您可以在我在其他相关问题上的回答中找到它们。请注意,这是“最初的回答”。

感谢您发布这篇文章,正是我所需要的。 - James Shrum

1
我建议使用get_ticks()代替get_time()。您应该了解它们之间的区别,但我觉得如果您没有显式调用self.tick(),它可能无法按预期工作。
问题在于您的代码输出每个KEYUP事件之间的时间。还有另一种方法可以使代码正常工作,即每次循环遍历事件并继续前进,而不必嵌套while循环。
time_down = 0.0
time_elapsed = 0.0

while True:
    for ev in pygame.event.get():
        if ev.type == QUIT:
            break # you had a semicolon here, there is no need for it
        elif ev.type == KEYDOWN:
            if ev.key == K_SPACE:
                time_down = pygame.time.get_ticks()
        elif ev.type == KEYUP:
            if ev.key == K_SPACE:
                key += 1
                time_elapsed = (pygame.time.get_ticks() - time_down)/1000.0
                print "number: ", key, "duration: ", time_elapsed

    self.tick()
    pygame.display.update()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接