2014-06-06 34 views
10

Tworzę program typu stoper w python i chciałbym wiedzieć, jak wykryć, jeśli klawisz jest wciśnięty (np. P dla pauzy i s dla stop), i nie chciałbym, aby był coś takiego raw_input, który czeka dla danych wejściowych użytkownika przed kontynuowaniem wykonywania. Ktoś wie jak to zrobić w pętli while?wykrywanie naciśnięcia klawisza w python?

Również chciałbym, aby ten cross-platform, ale jeśli nie jest to możliwe, to mój główny cel rozwój jest linux

+0

możliwe duplikat [? W jaki sposób można zbudować licznik w python] (http://stackoverflow.com/questions/15378046/how-can-i-build-a-counter-in-python) – aruisdante

+0

dla OS X https://stackoverflow.com/a/47197390/5638869 działa w Pythonie 2 i 3 – neoDev

Odpowiedz

0

Nie byłoby to trudne do wykorzystania tkinter lub innego GUI (jak wxPython lub pyQT) w celu implementacji detektora lub innego interfejsu wykrywającego naciśnięcie klawisza.

Zapoznaj się z this thread.

2

Zastosowanie Pygame mieć okno, a następnie można dostać klucz wydarzenia.

Dla listu p:

import pygame, sys 
import pygame.locals 

pygame.init() 
BLACK = (0,0,0) 
WIDTH = 1280 
HEIGHT = 1024 
windowSurface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32) 

windowSurface.fill(BLACK) 

while True: 
    for event in pygame.event.get(): 
     if event.key == pygame.K_p: 
      #Do what you want to here 
      pass 
     if event.type == pygame.locals.QUIT: 
      pygame.quit() 
      sys.exit() 
+1

whoa, ja tylko patrząc na pygame, zanim wróciłem i sprawdziłem to. Wypróbuję to – lobuo

6

Jak PO wspomnieć o raw_input - to znaczy, że chce rozwiązania CLI. Linux: curses jest tym, czego potrzebujesz (Windows PDCurses). Curses, jest graficznym API dla oprogramowania cli, możesz osiągnąć coś więcej niż tylko wykrywanie kluczowych zdarzeń.

Ten kod wykrywa klucze do momentu naciśnięcia nowego wiersza.

import curses 

def main(win): 
    win.nodelay(True) 
    key="" 
    win.clear()     
    win.addstr("Detected key:") 
    while 1:   
     try:     
      key = win.getkey()   
      win.clear()     
      win.addstr("Detected key:") 
      win.addstr(str(key)) 
      if key == os.linesep: 
       break   
     except Exception as e: 
      # No input 
      pass   

curses.wrapper(main) 
+0

To jest naprawdę miłe. Musiał szukać na zawsze, zanim się z tym spotka. Wydaje się znacznie czystsze niż hackowanie za pomocą 'termios' i tak dalej ... –

+0

potrzebne, aby dodać' import os', aby móc wyjść, wyjdź z przykładu. – malte

3

Dla Okna można użyć msvcrt takiego:

import msvcrt 
    while True: 
     if msvcrt.kbhit(): 
      key = msvcrt.getch() 
      print(key) # just to show the result 
+4

msvcrt to moduł tylko dla systemu Windows. – Dunatotatos

+0

Używam teraz pynput, która może być lepszą odpowiedzią – Benjie

+0

Zauważ, że pynput do pracy na OS X (nie wiem o Linuksie) musi działać jako root, aby działać. Dla niektórych może to nie działać. – GabeWeiss

4

Python ma moduł keyboard z wieloma funkcjami. Zainstalować go, być może z tym poleceniem:

pip3 install keyboard 

następnie używać go w kodzie jak:

import keyboard #Using module keyboard 
while True:#making a loop 
    try: #used try so that if user pressed other than the given key error will not be shown 
     if keyboard.is_pressed('q'):#if key 'q' is pressed 
      print('You Pressed A Key!') 
      break#finishing the loop 
     else: 
      pass 
    except: 
     break #if user pressed other than the given key the loop will break 
+0

Nie jestem pewien dla systemu Linux, ale działa on w systemie Windows. –

+0

@Nathan Tuggy Dzięki za edycję. Nie jestem zbyt profesjonalny w języku angielskim. –

+2

'klawisze' najwyraźniej wymaga root w linux: / – Inaimathi

Powiązane problemy