2017-10-11 186 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,可以轻松识别击键。

再次感谢丹尼尔!

最大。