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()
4

2 回答 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),那么您可以在我对其他相关问题的回答中找到它们。

于 2019-08-05T06:51:33.910 回答
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()
于 2013-11-11T18:41:04.393 回答