Python 2.7 - 如何检查是否按下了 SHIFT-Key 或 CTRL+Key?
Python 2.7 - How to check if SHIFT-Key or CTRL+Key is pressed?
我在 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
实际上它工作得很好,除了如果用户按下 F12、F11 或 Cursor Up 键它会中断:我发现如果我按下 F12,getch() 将 return '\xe0',但似乎相同的代码也被其他提到的键 returned;无法捕获 CTRL、SHIFT、ALT 等
我想强制用户按 CTRL-F12,以避免因无意中按下其中一个键而退出等待。
我是不是做错了什么?有没有办法拦截与另一个键一起按下的 CTRL、ALT 或 SHIFT?
提前致谢,
马克斯 - 意大利
来自 msvcrt
msvcrt.getch()
的手册:
[..] If the pressed key was a special function key, this will return '[=13=]0' or '\xe0'; the next call will return the keycode.
只需再次调用 getch()
即可获得实际的键码
按照丹尼尔的建议,我修改了我的代码:
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 返回的键码不同,因此可以轻松识别击键。
再次感谢大牛!
最大
我建议您使用 keyboard
模块。它具有很多功能并且使用起来非常简单。您还可以使用它来检测按键。示例:
如果你想检测键 a
:
import keyboard as kb
while True:
if kb.is_pressed("a"):break
您还可以使用它来检测组合。例如,如果要检查 a
和 b
是否同时按下:
import keyboard as kb
while True:
if kb.is_pressed("a+b"):break
因此,您可以使用 to 来检测 ctrl
和 f12
是否被按下:
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
我在 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
实际上它工作得很好,除了如果用户按下 F12、F11 或 Cursor Up 键它会中断:我发现如果我按下 F12,getch() 将 return '\xe0',但似乎相同的代码也被其他提到的键 returned;无法捕获 CTRL、SHIFT、ALT 等
我想强制用户按 CTRL-F12,以避免因无意中按下其中一个键而退出等待。
我是不是做错了什么?有没有办法拦截与另一个键一起按下的 CTRL、ALT 或 SHIFT?
提前致谢, 马克斯 - 意大利
来自 msvcrt
msvcrt.getch()
的手册:
[..] If the pressed key was a special function key, this will return '[=13=]0' or '\xe0'; the next call will return the keycode.
只需再次调用 getch()
即可获得实际的键码
按照丹尼尔的建议,我修改了我的代码:
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 返回的键码不同,因此可以轻松识别击键。
再次感谢大牛!
最大
我建议您使用 keyboard
模块。它具有很多功能并且使用起来非常简单。您还可以使用它来检测按键。示例:
如果你想检测键 a
:
import keyboard as kb
while True:
if kb.is_pressed("a"):break
您还可以使用它来检测组合。例如,如果要检查 a
和 b
是否同时按下:
import keyboard as kb
while True:
if kb.is_pressed("a+b"):break
因此,您可以使用 to 来检测 ctrl
和 f12
是否被按下:
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