2016-11-17 69 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) 

注:

它只能檢測到您將在代碼編寫的關鍵。