代码之家  ›  专栏  ›  技术社区  ›  Fields

python需要更快的getch响应

  •  0
  • Fields  · 技术社区  · 8 年前

    我正在尝试创建一个设置来闪烁led并能够控制频率。 一切都在运转,都在做该做的事,但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 回复  |  直到 8 年前
        1
  •  2
  •   Karoly Horvath    8 年前

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

    E、 g.:如果钥匙不在 Esc ,您将再次读取键盘。

        2
  •  1
  •   j2ko    8 年前
    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)