2016-08-03 109 views
0

我想找到一種方法來獲取Python中的KeyDown和KeyUp事件。使用Pygame,這可以通過pygame.KEYDOWNpygame.KEYUP輕鬆完成,但我試圖找到一種不使用GUI的方法。沒有GUI的Python鍵盤事件(非阻塞)

理想情況下,我想能夠定義一個函數isKeyDown(key),這將返回True如果key目前被關押了,還是回到False如果它不是,但無論哪種方式,它會與代碼繼續前行(這將是非阻塞的)。例如:

while True: 
    if not isKeyDown("a"): #If 'a' isn't currently being pressed 
     print ("You are not pressing 'a'") 
    elif isKeyDown("a"): #If 'a' is being held down when this is run 
     print ("You are pressing 'a'") 
     print ("This is the end of this program") 
     break 

我試過msvcrt.getch(),但有兩個問題:

1),直到一些被按下它停止程序,並

2)它並沒有真正告訴你是否按下了鑰匙;如果在此時按下該鍵,它會簡單地返回。這有時可能會一致,因爲Windows在按下按鍵時會重複按鍵,但在循環以最大速度運行時不太可能發生。

我也用msvcrt.kbhit(),但它本身如果任何鍵被按下,而不是由msvcrt.getch()閱讀,使仍然運行進入msvcrt.getch()的問題並沒有真正返回鍵是否實際上是設置爲1目前被壓制。

我使用的是Windows,所以許多人用來回答類似問題的curses模塊不可用。

有沒有一種方法可以在沒有GUI的情況下在Windows中定義這樣的isKeyDown()函數,最好只使用內置模塊?如果內置的Python模塊無法實現,只要不需要GUI,第三方模塊就可以。

即使使用Pygame或Tkinter也沒關係,只要關閉它們的圖形用戶界面即可。

如果這是不可能的,請告訴我爲什麼,所以我可以停止尋找解決方案(過去幾天我一直在嘗試做其他事情)。

我在64位Windows 10筆記本電腦上使用Python 3.5.2。

+0

請參閱此問題:http://stackoverflow.com/questions/13564851/generate-keyboard-events –

+1

@GaurabDhama:完全無關。這個問題是問,如何**接收**輸入。你鏈接的問題解釋,如何**生成**輸入。 – IInspectable

+1

@GauravDhama我已經看過這個問題,它解釋了_generating_鍵盤事件的方式,而我正在尋找將鍵盤事件作爲_inputs_的方法。 – Sid

回答

0

它看起來像你想要做的是得到pyhook。我相信這取決於pywin32庫。

基本上你想要做的是尋找創建一個鍵盤記錄。這會給你無阻塞的鍵盤事件。當然,您可能想要使用win32 api來確保當按下該按鍵時,您的窗口是焦點,如果這對您很重要。

我沒有我的窗口框可訪問,或者我能夠給你更多的代碼示例,但至少應該指出你在正確的方向。

+0

我花了一段時間才實施,但成功。謝謝!順便說一下,如果您知道任何可以關閉(以及稍後再打開)Windows鍵重複機制的Python命令,請告訴我嗎? – Sid

+0

優秀!我懷疑你能夠關閉重複鍵 - 我懷疑這是鍵盤的功能(儘管我可能完全錯了)。否則,我會嘗試挖掘谷歌結果「Windows關閉重複鍵」。我知道你*可以*做無障礙的事情,你永遠按住左移,然後每輸入一個字母大概需要3-5秒鐘......不確定這是否會做你想要的,但它可能會! –

+1

其實,我剛發現pyHook模塊甚至沒有必要;在Windows上,win32api和win32con模塊足以達到此目的:win32api.GetAsyncKeyState()函數滿足要求。它也適用於pyHook,但它不是必需的。 – Sid