在python中,如何使用键盘按键停止秒表?

在python中,如何使用键盘按键停止秒表?,python,input,time,Python,Input,Time,我用python制作了一个非常初级的秒表,只是为了让自己更习惯它(这是我的第一种编程语言),我一直试图让代码在按键时停止运行(使用键盘中断),但代码基本上忽略了键盘中断,并且一直在运行。 (这是我的代码供参考) 当用户使用ctrl+c退出程序时,会引发键盘中断异常。您需要使用另一种方法来检测按键。似乎有一个很好的跨平台类来检查stdin 编辑:我上面链接的答案需要用户按enter键,这样,如果您在不同的线程中运行它,就可以工作 以下方法适用于任何按键,但仅适用于Windows import ms

我用python制作了一个非常初级的秒表,只是为了让自己更习惯它(这是我的第一种编程语言),我一直试图让代码在按键时停止运行(使用键盘中断),但代码基本上忽略了键盘中断,并且一直在运行。 (这是我的代码供参考)


当用户使用
ctrl+c
退出程序时,会引发
键盘中断
异常。您需要使用另一种方法来检测按键。似乎有一个很好的跨平台类来检查stdin

编辑:我上面链接的答案需要用户按enter键,这样,如果您在不同的线程中运行它,就可以工作

以下方法适用于任何按键,但仅适用于Windows

import msvcrt
# Time
import time
import sys
timeLoop = True
# Variables to keep track and display
Sec = 0
Min = 0
Hour = 0
# Begin Process
while True:
    try:
        Sec += 1
        print(str(Hour) + " Hrs " + str(Min) + " Mins " + str(Sec) + " Sec ")
        time.sleep(1)
        if Sec == 60:
            Sec = 0
            Min += 1
            print(str(Min) + " Minute")
            if Min == 60:
                Sec = 0
                Min = 0
                Hour += 1
                print(str(Hour) + " Hours")
        if msvcrt.kbhit():
            break
    except KeyboardInterrupt:
        break
编辑2:。在下面的示例中,我将它保存在与
kbhit.py
相同的目录中,并在第1行导入了它

使用第二个线程(,):


不一定要回答这个问题,但是为什么要定义
timeloop
两次,而且当timeloop==True:时也不需要做
,只要做
而timeloop:
在这种情况下,因为从来没有使用过timeloop变量,所以它可以是
而True:
。您使用的是Python 2还是Python 3?
原始输入()
要求用户按enter键。谢谢!现在效果很好:)太好了!那么,请您将此标记为答案好吗?问题是,计算kbhit所需的时间会使计时器超时。计时器必须是一个完全独立的线程,否则它不会真正是一毫秒。根据处理器的速度,我们不知道处理kbhit需要多长时间。尤其是像Python这样速度较慢的语言。
import msvcrt
# Time
import time
import sys
timeLoop = True
# Variables to keep track and display
Sec = 0
Min = 0
Hour = 0
# Begin Process
while True:
    try:
        Sec += 1
        print(str(Hour) + " Hrs " + str(Min) + " Mins " + str(Sec) + " Sec ")
        time.sleep(1)
        if Sec == 60:
            Sec = 0
            Min += 1
            print(str(Min) + " Minute")
            if Min == 60:
                Sec = 0
                Min = 0
                Hour += 1
                print(str(Hour) + " Hours")
        if msvcrt.kbhit():
            break
    except KeyboardInterrupt:
        break
from kbhit import KBHit
# Time
import time
import sys
timeLoop = True
# Variables to keep track and display
Sec = 0
Min = 0
Hour = 0

k = KBHit()
# Begin Process
while True:
    try:
        Sec += 1
        print(str(Hour) + " Hrs " + str(Min) + " Mins " + str(Sec) + " Sec ")
        time.sleep(1)
        if Sec == 60:
            Sec = 0
            Min += 1
            print(str(Min) + " Minute")
            if Min == 60:
                Sec = 0
                Min = 0
                Hour += 1
                print(str(Hour) + " Hours")
        if k.kbhit():
            break
    except KeyboardInterrupt:
        break
def quit_on_user_input():
    input = raw_input("Press any key to quit.")
    # thread will lock up and wait for user to input. That's why this is on a separate thread.
    sys.exit(0)

quit_thread = threading.Thread(target=quit_on_user_input, args=[])
quit_trhead.start()
# The rest of your code. quit_thread will run in the background and therefor won't lock up your main thread.