询问输入一次然后等待响应

时间:2017-11-19 14:49:54

标签: python loops python-3.5

我是一个新手,我对在循环工作时询问输入有疑问。 让我假装我有简单的循环。

x = 1    
y = 1
while x == 1:
   y += 1
   print(y)

现在我想要用户输入来停止这个脚本但是只有当他键入cancel并且循环应该在python等待输入时运行时才会停止。

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,您可以使用threading模块中的线程实现“在等待输入时运行循环”。

我们的想法是让两个线程并行运行(即同时运行),并且每个线程都会做自己的事情。第一个只做一件事:等待输入。第二个将执行你将放在循环中的工作,并且只根据从第一个线程获得的信息检查每个循环的开始是否应该停止。

以下代码说明了这一点(注意这需要python3):

from threading import Thread
import time


class Input_thread(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.keep_working = True

    def run(self):
        while True:
            a = input("Type *cancel* and press Enter at anytime to cancel \n")
            print("You typed "+a)
            if a == "cancel":
                self.keep_working = False
                return
            else:
                pass


class Work_thread(Thread):
    def __init__(self, other_thread):
        Thread.__init__(self)
        self.other_thread = other_thread

    def run(self):
        while True:
            if self.other_thread.keep_working is True:
                print("I'm working")
                time.sleep(2)
            else : 
                print("I'm done")
                return



# Creating threads
input_thread = Input_thread()
work_thread = Work_thread(input_thread)

# Lanching threads
input_thread.start()
work_thread.start()

# Waiting for threads to end
input_thread.join()
work_thread.join()

正如您所看到的,使用threading并非易事,需要一些关于类的知识。

以稍微简单的方式实现类似的方法是使用名为KeyboardInterrupt的python异常。如果您不熟悉异常:有python在代码中处理错误的方法,这意味着如果在代码中的某些时候Python发现它无法运行的行,它将引发异常 ,如果没有计划处理该错误(也就是如果你没有使用try/except语法捕获异常),python将停止运行并显示该异常和回溯终端窗口。

现在问题是当你的程序运行时在终端窗口中按Ctrl-c(与复制快捷方式相同),它会自动在程序中引发一个名为KeyboardInterupt的异常,你可以抓住它以将cancel发送到您的程序。 请参阅该代码以获取如何执行此操作的示例:

import time 

y=1
try:
    while True:
        y+=1
        print(y)
        time.sleep(1)

except KeyboardInterrupt:
    print("User pressed Ctrl-c, I will now exit gracefully")

print("Done")