Python 2.7 - 如何检查是否按下了 SHIFT-Key 或 CTRL+Key?

Max*_*ITA 2 python keypress ctrl python-2.7

我在 python 2.7 中编写了一个小程序,它会等待一段时间(比如 10 分钟),但如果用户按下某个键,它会立即退出。

我在 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
Run Code Online (Sandbox Code Playgroud)

实际上它工作得很好,除了如果用户按 F12、F11 或 Cursor Up 键它会中断这一事实:我发现如果我按 F12,getch() 将返回 '\xe0',但它其他提到的键似乎也返回相同的代码;无法捕获 CTRL、SHIFT、ALT 等。

我想强制用户按 CTRL-F12,以避免因无意中按下其中一个键而退出等待。

难道我做错了什么?有没有办法拦截 CTRL、ALT 或 SHIFT 与另一个键一起按下?

提前致谢,Max - 意大利

Bla*_*der 6

我会建议你使用keyboard模块。它有很多功能,而且使用起来非常简单。您还可以使用它来检测按键。例子:
如果你想检测 key a

import keyboard as kb
while True:
    if kb.is_pressed("a"):break
Run Code Online (Sandbox Code Playgroud)

您还可以使用它来检测组合。例如,如果要检查ab是否同时按下:

import keyboard as kb
while True:
    if kb.is_pressed("a+b"):break
Run Code Online (Sandbox Code Playgroud)

所以,你可以使用,如果对检测ctrlf12压制:

import keyboard as kb
while True:
    if kb.is_pressed("ctrl+f12"):break
Run Code Online (Sandbox Code Playgroud)

根据您发布的代码的示例:

import sys
import keyboard as kb
import time
def sleep_sec(secstosleep,allowskip=True):
    t = time.time() #getting time in sec
    sys.stdout.write("\n    Sleeping for %s seconds. You can press CTRL-F12 to skip.\n\n"% secstosleep)
    if allowskip:
        while time.time() - t <= secstosleep: #while current time(in sec) - t is less than secstosleep
            if kb.is_pressed("ctrl+f11"): #if ctrl and f12 are pressed
                print "\a"
                sys.stdout.write("\nSleep interrupted by User\n")
                quit(0)
sleep_sec(10*60) # 10*60 == 10 min
Run Code Online (Sandbox Code Playgroud)