Используйте getch в while (1) python

Я хотел бы использовать char=getch.getch() в цикле (while(1)). Проблема, когда я использую это так, что это блокирует мой цикл:

import getch

while(1):
         char=getch.getch()
         a=read_data()
         if (char=='a'): c=....
         if (char=='b'): c=.... 

Если я ничего не ставлю, мой цикл блокируется... Как я могу решить эту проблему для получения события с моей клавиатуры?

РЕДАКТИРОВАТЬ: В верхней части приведен пример того, что я хочу сделать, но если вы заинтересованы, мой настоящий сценарий здесь. На самом деле я работаю с анализатором спектра и хочу сканировать, нажимая несколько клавиш:

from pylab import *
from rtlsdr import *
from bluetooth import *

import sys
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import getch

sdr=RtlSdr()

#configure device
sdr.center_freq=double(sys.argv[1]) # centrale frequency
sdr.gain=double(sys.argv[2]) #gain
sdr.sample_rate=double(sys.argv[3]) # sample rate

#configure PSD
NFFT=int(sys.argv[4]) # nb points

# Bluetooth connexion
server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)
port = server_sock.getsockname()[1]
uuid="94f39d29-7d6d-437d-973b-fba39e49d4ee"
client_sock, client_info=server_sock.accept()

while (1):

    samples=sdr.read_samples(256*1024)
        result=psd(samples,NFFT,Fs=sdr.sample_rate/1e6,Fc=sdr.center_freq*1e6/1e6)

        tab_freq=(result[1]/1e6)
        value_freq=str(tab_freq)[1:-1]
        value_list=[format(float(v), ".5f") for v in value_freq.split()]
        value_freq2= "\n".join(value_list)

        tab_pxx=result[0]
        value_pxx=str(tab_pxx)[1:-1]
        value_list2=[format(float(v), ".7f") for v in value_pxx.split()]
        value_pxx2= "\n".join(value_list2)

        client_sock.send(value_freq2+'\n'+'\n'.join(value_pxx2.split()))

        char=getch.getch()

        if (char=='a'):
        sdr.center_freq=sdr.center_freq+0.1e6
        print 'center_freq+'
        if (char=='z'):
        sdr.center_freq=sdr.center_freq-0.1e6
        print 'center_freq-'

1 ответ

Если вы работаете в Windows, вы можете использовать msvcrt.kbhit() чтобы увидеть, есть ли нажатие клавиши без блокировки:

import msvcrt
import time

while True:
    time.sleep(1)
    if msvcrt.kbhit():
        # Only if there's a keypress waiting do we get it with getch()
        print "Key hit! ({})".format(msvcrt.getch())
    else:
        # Do something else here
        print "Nothing..."

В Linux все сложнее, потому что нет kbhit() эквивалент.

Другие вопросы по тегам