2017-10-11 187 views
0

我在python 2.7中寫了一個小例程,它等待一段時間(比如說10分鐘),但如果用戶按下某個鍵,它將立即退出。Python 2.7 - 如何檢查SHIFT-KEY或CTRL +鍵是否被按下?

我(在Windows 7 64位),所以我嘗試使用MSVCRT庫:

import sys 
import msvcrt 
from time import sleep 

    def sleep_sec(secstosleep, allowskip = True): 
     waitinterval_ms = 0.050 
     nwaits = int(secstosleep * 1000/waitinterval) 

     sys.stdout.write("\n Sleeping for %s seconds. You can press CTRL-F12 to skip.\n\n" % secstosleep) 
     for sl in range(0, nwaits + 1): 
      sleep(waitinterval_ms) 
      if allowskip: 
       # Check if User has pressed CTRL-F12 to stop waiting 
       if = msvcrt.kbhit(): 
        kp = msvcrt.getch() 
        if kp == '\xe0': 
         print "\a" # Beep once 
         sys.stdout.write("\nSleep interrupted by User\n") 
         break 

實際上它工作得很好,除了事實,這將打破,如果用戶命中F12,F11或Cursor Up鍵:我發現如果按F12,getch()將返回'\ xe0',但似乎相同的代碼也由其他提到的鍵返回;無法捕獲CTRL,SHIFT,ALT等。

我想強制用戶按下CTRL-F12,而不是無意中擊中其中一個鍵。

我做錯了什麼?有沒有辦法阻止CTRL,ALT或SHIFT與另一個鍵一起被按下?

由於提前, 馬克斯 - 意大利

回答

1

msvcrt手冊msvcrt.getch()

[..]如果按下的鍵是一個特殊的功能鍵,這將返回 '\ 000'或'\ xe0';下一次調用將返回鍵碼。

只需撥打getch()再次獲得實際的鍵碼

+0

非常感謝Daniel,現在它完美的工作!最大。 –

0

至於建議由丹尼爾,我已經修改了我這樣的代碼:

import sys 
import msvcrt 
from time import sleep 

def sleep_sec(secstosleep, allowskip = True): 
    waitinterval_ms = 0.050 
    nwaits = int(secstosleep * 1000/waitinterval) 

    sys.stdout.write("\n Sleeping for %s seconds. You can press CTRL-F12 to skip.\n\n" % secstosleep) 
    for sl in range(0, nwaits + 1): 
     sleep(waitinterval_ms) 
     if allowskip: 
      # Check if User has pressed CTRL-F12 to stop waiting 
      if = msvcrt.kbhit(): 
       kp = msvcrt.getch() 
       if kp == '\xe0': 
        kp += msvcrt.getch() 

       if kp == '\xe0\x8a': # \x8a is the keycode for CTRL-F12 
        print "\a" # Beep once 
        sys.stdout.write("\nSleep interrupted by User\n") 
        break 

我也注意到,不同的鍵碼返回對於F12,CTRL-F12和SHIFT-F12,可以輕鬆識別擊鍵。

再次感謝丹尼爾!

最大。