2016-11-17 124 views
5

假设我想在python中创建一个非常简单的程序来指示按下按键的时间。因此,如果我键入并按住j键一会儿,我正在寻找能够显示信息的程序,例如the key 'j' was pressed for 1.1 seconds确定python中按键的长度

从我所了解的情况来看,应该实现的方法是检测KEYDOWN事件和KEYUP事件并对其进行时间戳,并适当减少时间戳。因此,检测KEYDOWN和KEYUP事件就足够了。

关于检测单个按键或检测单个字符输入的SO有很多种问题和答案,如this onethis one,它们都使用某种形式的getch。我已经看了python curses库,并且从我可以告诉的关键检测的主要形式也是以单字符getch()的形式。但是这些不检测按键的长度---他们只检测KEYDOWN。

我认识到,检测按键的长度是游戏中的必要任务,所以我期望pygame有检测按键持续时间的方法。但我希望有可能使用更简单更直接的库来检测按键持续时间。

+0

PyGame有'KEYDOWN'和'KEYUP'事件,所以你可以得到时间和减少。 – furas

+0

所有'GUI'都应该有方法来获得'KEYDOWN'和'KEYUP'事件。 – furas

+0

我的回答有什么不正确的地方吗? :) –

回答

1

使用pynput模块:(最佳)

您可以使用此代码:

from pynput import keyboard 
import time 

def callb(key): #what to do on key-release 
    ti1 = time.time() - t 
    ti1 = str(ti1) #converting float value to string 
    ti2 = ti1[0:5] #cutting the seconds (time) , without it , it will print like 0.233446546 
    print("The key",key,"Pressed For",ti2,'seconds') 
    return False #stop detecting more key-releases 
def callb1(key): #what to do on key-press 
    return False #stop detecting more key-presses 

with keyboard.Listener(on_press = callb1) as listener1: #setting code for listening key-press 
    listener1.join() 

t = time.time() 

with keyboard.Listener(on_release = callb) as listener: #setting code for listening key-release 
    listener.join() 

注:

我不知道如果pynput是内置的模块,如果你收到ModuleNotFoundError然后用pip进行安装:
pip install pynput

使用pygame(良好)

import time 
import pygame 
import os 
os.environ["SDL_VIDEO_CENTERED"] = "1" 

screen = pygame.display.set_mode((600, 600)) 
pygame.display.set_caption("Time") 
clock = pygame.time.Clock() 

pygame.init() 

clock = pygame.time.Clock() 

running = True  
while running: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
      pygame.quit() 
      break 
     if event.type == pygame.KEYDOWN: 
      # detect key 'a' 
      if event.key == pygame.K_a: # key 'a' 
       t = time.time() 
     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_a: # key 'a' 
       t = time.time() - t; t = str(t); t = t[:5] 
       print("You pressed key 'a' for",t,'seconds') 


     screen.fill((255, 255, 255)) 
     pygame.display.update() 

     clock.tick(40) 

注:

它只能检测到您将在代码编写的关键。