2015-07-13 117 views
2

我在這裏有一個悖論。我使用GetKeyState爲了檢索賦予vk_code的狀態。我已經開發了兩個函數來協助我的任務:如何在while循環中只執行一個按鍵? (PyWin32)

import win32api 

def get_key_state(vk_code): 
    state = int(win32api.GetKeyState(vk_code)) 
    if state == 1 or state == -127: 
     return 1 # Key is on. 
    elif state == 0 or state == -128: 
     return 0 # Key is off. 

def press_key(vk_code): 
    state = int(win32api.GetKeyState(vk_code)) 
    if state == -127 or state == -128: 
     return 1 # Key was pressed. 
    else: 
     return 0 # Key was released. 

state從0開始的值,然後同時給予鍵被按下時,它將變爲-127,然後當我釋放,它更改爲1,然後當鑰匙再次按住,它變爲-128,最後它得到回0

當我使用press_key主循環裏面,像這樣:

if __name__ == "__main__": 

    while True: 
     p_key = 80 
     if press_key(p_key): 
      print("P key was pressed.") 

當按下並釋放按鍵時,我會得到以下輸出:

enter image description here

我怎樣才能獲得按鍵只有一次如果在while循環?就像這樣:

enter image description here

但沒有打破整個循環。觀察:我知道我在這裏重新發明輪子(因爲我可以使用PyHook或其他東西),但我真的很想知道它!我希望只在主循環內觸發一次「事件」(即使按住鍵),但我無法掌握邏輯。

回答

1

那麼如果你想確保印刷機將只能使用一次,不管他們持有多久,你可以有一個狀態變量來檢查,如果這是第一次,特別是按鍵登記註冊:

import win32api 

HUMAN_KEYPRESS_TIME = 0.3 

def press_key(vk_code): 
    state = int(win32api.GetKeyState(vk_code)) 
    if state == -127 or state == -128: 
     return 1 
    else: 
     return 0 

keyDown = False 
if __name__ == "__main__": 
    firstPress = True 
    while True: 
     p_key = 80 
     if press_key(p_key): 
      if firstPress: 
       firstPress = False 
       print("P key was pressed.") 
     else: 
      firstPress = True 

這不會妨礙循環,它允許您按鍵快速按鍵盤允許;另一種方法只允許您每隔300毫秒按一次,並阻止循環很長時間。

+0

哦,你解決它沒有使用時間:o。我印象深刻。這是我沒有拿出哈哈的確切邏輯。 –

0

原來,解決方案非常明顯。我已經使用time.sleep()完美解決了這個問題。

import win32api 
import time 

HUMAN_KEYPRESS_TIME = 0.3 

def press_key(vk_code): 
    state = int(win32api.GetKeyState(vk_code)) 
    if state == -127 or state == -128: 
     return 1 # Key was pressed. 
    else: 
     return 0 # Key was released. 

if __name__ == "__main__": 

    while True: 
     p_key = 80 
     if press_key(p_key): 
      print("P key was pressed.") 
      time.sleep(HUMAN_KEYPRESS_TIME) 

我得出的結論,這是不可能的「只執行一次」,同時保持按住鍵,然後我意識到,答案是時間。如果我希望只用一次按鍵就能執行一次代碼塊,那麼我只需要在每次物理按鍵之間休息整個應用程序一段時間。