2016-11-17 18 views
5

Załóżmy, że chcę utworzyć bardzo prosty program w python, który wskazuje, jak długo klawisz jest naciśnięty. Tak więc, jeśli piszę i przytrzymam klawisz j przez kilka chwil, szukam napisać program zdolny do wyświetlania informacji, takich jak the key 'j' was pressed for 1.1 seconds.Określa długość naciśnięcia klawisza w pytonie

Z tego co wiem, sposób, w jaki należy to osiągnąć, polega na wykrywaniu i sygnalizowaniu znaczników zdarzeń KEYDOWN i zdarzeń KEYUP oraz dokonywaniu odpowiednich odejmowań znaczników czasu. Więc wystarczy wykryć zdarzenia KEYDOWN i KEYUP.

Istnieje wiele różnych pytań i odpowiedzi dotyczących SO dotyczących wykrywania pojedynczego naciśnięcia klawisza lub wykrywania wejścia pojedynczego znaku, takiego jak this one lub this one, które wykorzystują jakąś formę getch. Spojrzałem na bibliotekę przekleństw Pythona i z tego, co mogę powiedzieć, podstawowa forma wykrywania kluczy jest również w postaci jednoliterowego getch(). Ale te nie wykrywają długości naciśnięcia klawisza --- wykrywają tylko KEYDOWN.

Rozumiem, że wykrywanie długości naciśnięcia klawisza jest koniecznym zadaniem w grach, więc spodziewam się, że pygame ma metody wykrywania czasu trwania naciśnięcia klawisza. Ale mam nadzieję, że można użyć znacznie cieńszej i bardziej bezpośredniej biblioteki, aby wykryć czas trwania naciśnięcia klawisza.

+0

PyGame zawiera zdarzenia "KEYDOWN" i "KEYUP", dzięki czemu można uzyskać zarówno czas, jak i odjąć. – furas

+0

Wszystkie 'GUI' powinny mieć metody, aby uzyskać zdarzenia' KEYDOWN' i 'KEYUP'. – furas

+0

Czy moja odpowiedź jest niepoprawna? :) –

Odpowiedz

1

Korzystanie pynput moduł: (Najlepsza)

można użyć tego kodu:

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

Uwaga:

Nie jestem pewien, czy pynput jest moduł wbudowany, jeśli otrzyma ModuleNotFoundError następnie użyj pip, aby go zainstalować:
pip install pynput

Korzystanie pygame: (dobrze)

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) 

Uwaga:

To wykryje tylko klucze, które można napisać w kodzie.

Powiązane problemy