python 非终止键盘中断

python non-terminating keyboard interrupt

不确定这里的术语。

我有一个定时器循环

 flag=False
 for second in range(10*60) :
   do_something
   if flag :
     add_trick
     flag = False
  
     

我想在设置标志的任意点按一个特殊键。

我尝试添加一个关键侦听器。这是我的测试代码。

 from pynput import keyboard
 
 flag=False
 def on_press(key):
     global flag
     match str(key) :
         case "'s'" : 
             flag=True
     return True
     
 def run_timer():
     global flag
     flag=False
     while True: # for second in range(10*60) :
       #sleep(1)
       print('a')
       if flag :
          print('FLAG')
          flag = False
 
 
 
 if __name__=="__main__" :
     listener = keyboard.Listener(on_press=on_press)
     listener.start() 
     #listener.join()
     run_timer()
   

没用。

没有 listener.join() 听众就不会参与。

使用 listener.join() 时,侦听器会阻塞并且循环不会 运行。

回调中的key参数不是字符串,而是一个pynput.keyboard.Key对象。因此,您需要将 key.char"s".

进行比较,而不是将其与 "s" 进行比较

这是测试代码的清理版本,它将设置标志 3 次,然后清理侦听器线程并退出:

import time                                                                                         
from pynput import keyboard                                                                         
                                                                                                    
flag = False                                                                                        
def on_press(key):                                                                                  
    global flag                                                                                     
    if key.char == "s":                                                                             
        flag = True                                                                                 
    return True                                                                                     
                                                                                                    
def run_timer():                                                                                    
    global flag                                                                                     
    flag = False                                                                                    
    flag_count = 0                                                                                  
    while flag_count < 3:                                                                           
        time.sleep(0.1)                                                                                
        if flag :                                                                                   
            print('FLAG')                                                                           
            flag = False                                                                            
            flag_count += 1                                                                         
                                                                                                    
if __name__=="__main__" :                                                                           
    listener = keyboard.Listener(on_press=on_press)                                                 
    listener.start()                                                                                
    run_timer()                                                                                     
    listener.stop()                                                                                 
    listener.join()                                                                                 
    print("listener cleaned up")