Python2.7如何检查是否按下了SHIFTKey或CTRL+Key?

2024-09-28 01:33:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python2.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

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

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

我做错什么了吗?有没有一种方法可以阻止按下CTRL、ALT或SHIFT键的同时按下另一个键?在

提前谢谢你, 马克斯-意大利


Tags: 用户importifstdoutsyssleepwritems
3条回答

来自msvcrt手册中的msvcrt.getch()

[..] If the pressed key was a special function key, this will return '\000' or '\xe0'; the next call will return the keycode.

只需再次调用getch()以获得实际的密钥码

正如Daniel建议的那样,我修改了我的代码:

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,返回了不同的键码,因此可以很容易地识别击键。在

再次感谢你,丹尼尔!在

最大值

我建议您使用^{}模块。它有很多特性,而且使用起来非常简单。你也可以用它来检测按键。示例:
如果要检测密钥a

import keyboard as kb
while True:
    if kb.is_pressed("a"):break

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

^{pr2}$

因此,您可以使用来检测是否按下了ctrl和{}:

import keyboard as kb
while True:
    if kb.is_pressed("ctrl+f12"):break

根据您发布的代码示例:

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

相关问题 更多 >

    热门问题