2014-03-12 55 views
3

我的代碼如下:Python Windows`msvcrt.getch()`只檢測每隔3次按鍵?

import msvcrt 
while True: 
    if msvcrt.getch() == 'q':  
     print "Q was pressed" 
    elif msvcrt.getch() == 'x':  
     sys.exit() 
    else: 
     print "Key Pressed:" + str(msvcrt.getch() 

這個代碼是基於this question;我用它來熟悉getch

我注意到需要3次按鍵3次才輸出一次文本。爲什麼是這樣?我試圖用它作爲一個事件循環,這是一個滯後太多......

即使我鍵入3 不同鍵,它只輸出第三個按鍵。

我該如何強制它變得更快?有沒有更好的方法來實現我想要實現的目標?

謝謝!

evamvid

回答

8

您在循環中調用該函數3次。嘗試調用它只有一次這樣的:

import msvcrt 
while True: 
    pressedKey = msvcrt.getch() 
    if pressedKey == 'q':  
     print "Q was pressed" 
    elif pressedKey == 'x':  
     sys.exit() 
    else: 
     print "Key Pressed:" + str(pressedKey) 
+0

爲什麼它'var pressedKey = msvcrt.getch()'?不要以爲它是有效的Python語法 –

+1

@ wizard23可能有他的javascript帽子,但他有正確的想法。只是刪除'var' – jdigital

+0

我看到答案已經修復:) tnx!是的js滑入...我無法測試它,因爲我沒有在這裏的窗口,msvcrt是win32的具體;) – wizard23

1

可以通過同時使用msvcrt.kbhit功能,這將允許你叫msvcrt.getch()只有儘可能優化的東西一點點是必要的:

while True: 
    if msvcrt.kbhit(): 
     ch = msvcrt.getch() 
     if ch in '\x00\xe0': # arrow or function key prefix? 
      ch = msvcrt.getch() # second call returns the scan code 
     if ch == 'q': 
      print "Q was pressed" 
     elif ch == 'x': 
      sys.exit() 
     else: 
      print "Key Pressed:", ch 

注意打印的Key Pressed值對於諸如功能鍵之類的東西是沒有意義的。這是因爲這種情況下,密鑰真的是Windows scan code,而不是字符的常規密鑰代碼。

+0

'msvcrt.khbit()'是如何工作的?當它檢測到按鍵時只調用'mscvrt.getch()'嗎? – evamvid

+0

我不知道詳細信息,它是MS C/C++運行時庫的一部分。它不會調用'mscvrt.getch()'AFAIK,它只是告訴你是否有密鑰可用。鍵擊由OS和鍵盤硬件緩衝。 – martineau

+0

請注意,通過使用掃描碼錶,您可以檢測常規功能和箭頭鍵。 – martineau