python需要使用getch更快的响应

时间:2016-09-02 21:03:00

标签: python msvcrt getch

我正在尝试创建一个设置以使LED闪烁并能够控制频率。 现在我只是打印10s作为占位符进行测试。 一切都在运行,应该做什么,但是getch让我失望。

freq = 1
while freq > 0:
    time.sleep(.5/freq) #half dutycycle / Hz
    print("1")
    time.sleep(.5/freq) #half dutycycle / Hz
    print("0")

    def kbfunc():
        return ord(msvcrt.getch()) if msvcrt.kbhit() else 0
    #print(kbfunc())

    if kbfunc() == 27: #ESC
        break
    if kbfunc() == 49: #one
        freq = freq + 10
    if kbfunc() == 48: #zero
        freq = freq - 10

现在,当它启动时,频率变化部分似乎有些错误,因为它不是一直在阅读,或者我必须按下正确的时间。无论何时按下,断线都没有问题。

2 个答案:

答案 0 :(得分:2)

应该只有一个kbfunc()电话。将结果存储在变量中。

例如:如果密钥不是Esc,则在您的代码中,您将再次阅读键盘。

答案 1 :(得分:1)

from msvcrt import getch,kbhit
import time

def read_kb():
    return ord(getch()) if kbhit() else 0
def next_state(state):
    return (state + 1)%2 # 1 -> 0, 0 -> 1

freq = 1.0 # in blinks per second
state = 0
while freq > 0:
    print(state)
    state = next_state(state)

    key = read_kb()

    if key == 27: #ESC
        break
    if key == 49: #one
        freq = freq + 1.0
    if key == 48: #zero
        freq = max(freq - 1.0, 1.0)

    time.sleep(0.5/freq)