Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
制作一个“文件”;“任何键”;可中断Python定时器_Python_Multithreading_Timer_Interrupt - Fatal编程技术网

制作一个“文件”;“任何键”;可中断Python定时器

制作一个“文件”;“任何键”;可中断Python定时器,python,multithreading,timer,interrupt,Python,Multithreading,Timer,Interrupt,我正在尝试制作一个简单的计时器,它会一直计数,直到被键盘输入中断 现在我正在使用CTRL+C来停止计时器,但我想做一些更简单的事情,比如按空格键、回车键或“任意键”。我听说这可以通过线程模块来完成,但经过几次尝试后,我显然不知道我在用它做什么 这是我当前的代码: def countup(): try: a=0 for i in range(1000000) : print i,'\r', time.sleep

我正在尝试制作一个简单的计时器,它会一直计数,直到被键盘输入中断

现在我正在使用CTRL+C来停止计时器,但我想做一些更简单的事情,比如按空格键、回车键或“任意键”。我听说这可以通过线程模块来完成,但经过几次尝试后,我显然不知道我在用它做什么

这是我当前的代码:

def countup():
    try:
        a=0
        for i in range(1000000) :
            print i,'\r',
            time.sleep(1)
    except KeyboardInterrupt:
         Z = raw_input("restart timer?" )
         if Z == "Y" or Z == "y" :
             countup()

您的代码目前存在两个问题:

  • 在for循环期间,您没有检查键盘输入,因此程序不会注意到您是否在stdin中键入了随机字符
  • 键盘中断异常是在按下中断键(即Ctrl-C)时专门引发的
  • 问题是,您需要尝试从stdin读取数据,但如果没有任何输入,则不要等到输入出现在那里。提供了有关如何执行此操作的详细说明

    根据上面的链接,如果您按enter键,此代码应执行使倒计时停止的技巧:

    import sys 
    import select 
    import time
    
    def countup():
        i = 0
        while True:
            print i
            i += 1
            time.sleep(1)
            while sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
                line = sys.stdin.readline()
                if line:
                    r = raw_input("Restart?")
                    if r.lower() == "y":
                        countdown()
                    else:
                        break
    
     countup()
    

    您的代码目前存在两个问题:

  • 在for循环期间,您没有检查键盘输入,因此程序不会注意到您是否在stdin中键入了随机字符
  • 键盘中断异常是在按下中断键(即Ctrl-C)时专门引发的
  • 问题是,您需要尝试从stdin读取数据,但如果没有任何输入,则不要等到输入出现在那里。提供了有关如何执行此操作的详细说明

    根据上面的链接,如果您按enter键,此代码应执行使倒计时停止的技巧:

    import sys 
    import select 
    import time
    
    def countup():
        i = 0
        while True:
            print i
            i += 1
            time.sleep(1)
            while sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
                line = sys.stdin.readline()
                if line:
                    r = raw_input("Restart?")
                    if r.lower() == "y":
                        countdown()
                    else:
                        break
    
     countup()
    
    使用并可以写入(按任意键停止):

    让我们澄清一下:

    使用
    input\u thread()
    作为启动函数创建新线程。在主线程中提升
    键盘中断时

    返回当前端子属性
    ~termios.ICANON
    取消设置模式,并
    ~termios.ECHO
    阻止输入打印,然后执行更改

    或者,在Windows上,可以使用中的
    getch()
    from代替
    read\u key()


    参考
    使用并可以写入(按任意键停止):

    让我们澄清一下:

    使用
    input\u thread()
    作为启动函数创建新线程。在主线程中提升
    键盘中断时

    返回当前端子属性
    ~termios.ICANON
    取消设置模式,并
    ~termios.ECHO
    阻止输入打印,然后执行更改

    或者,在Windows上,可以使用中的
    getch()
    from代替
    read\u key()


    参考

    非常好。对于“按任意键”,我加载了MSVCRT模块,并将原始输入()函数替换为char=MSVCRT.getch()。然后对char使用if函数,当按下一个键时,该函数总是false。谢谢杰出的对于“按任意键”,我加载了MSVCRT模块,并将原始输入()函数替换为char=MSVCRT.getch()。然后对char使用if函数,当按下一个键时,该函数总是false。谢谢
    def input_thread():
        msvcrt.getch()
        thread.interrupt_main()