Python:检测特定按键并提示用户。

3
我需要每10秒打印一次句子“Hello World”。但是,如果用户输入'c'或'Enter'键,则程序应停止打印该句子并提示用户提供另一个句子。检查用户提供的句子,如果该句子包含任何数字,则显示消息:“不能包含数字”。否则显示消息:“正确的句子”。在显示任一消息之后,程序继续打印“Hello World”。
以下是我开始的代码。非常感谢您对如何进一步继续的任何提示。 谢谢!
```python import time while True: print("Hello World") time.sleep(10) ```
import threading

def looping():
    threading.Timer(10.0, looping).start()
    print("Hello World!")

looping()

1
多奇怪的作业......不管怎样,先试着创建一个没有“Hello world”部分的程序,每10秒执行一次;只是创建一个普通的输入-条件-分支结构。如果这个可以运行,再加上计时器功能。但是请注意线程和控制台输入/输出不够配合。 - Irmen de Jong
1个回答

1
根据我对任务说明的理解,看起来您正确地使用了计时器来打印“Hello World”!我想赞同Irmen de Jong在您的问题上的评论,关于语句“线程和控制台输入/输出不能很好地配合使用”,因为我在C编程中也遇到过这个问题。
一旦计时器开始运行,它打印到屏幕的文本不应影响响应键盘输入。如果真的需要直接响应'c'键(不是像通常使用从键盘读取输入时必须跟随'Enter'),我建议按照 Python method for reading keypress?中的一种解决方案来确定如何实现。
编辑:使用基于线程的计时器实现解决方案要困难得多。
正如您在研究此问题时可能发现的那样,threading.Timer对象具有可以用于控制单个线程计时器执行的start()stop()方法,如果您已将计时器保存在变量中(例如执行my_timer = threading.Timer(10.0, looping),然后调用my_timer.start()启动计时器),则可以使用这些方法。如果这样做,只要您在该点保留了对需要停止的当前计时器实例的正确引用,就可以调用my_timer.stop()来暂停循环。

为了使事情变得更加容易,我选择创建一个名为PAUSE_LOOPING的全局变量,当设置为False时,将阻止启动新的计时器实例,从而停止所有进一步的函数重复,直到将PAUSE_LOOPING设置回True并再次调用looping()为止:

import threading
from msvcrt import getch

PAUSE_LOOPING = False

def looping():
    global PAUSE_LOOPING
    if not PAUSE_LOOPING:
        threading.Timer(10.0, looping).start()
        print("Hello World!")

looping()

while True:
    # key = ord(getch())
    # if key == 13:  # Enter
    #     PAUSE_LOOPING = True
    input_string = input()
    if input_string == "":
        PAUSE_LOOPING = True
    else:
        PAUSE_LOOPING = False
        looping()

在上一个代码块中注释掉的是一种直接获取按键(无需按下“Enter”键,如input()所需)的方法,这个方法来自于我之前在回答中提到的stackoverflow问题。只要你使用的是Windows的Python(因此你安装了MS VC++运行库msvcrt),这个方法就可以工作,但为了使脚本在按下“Enter”键时停止,你可以使用标准的input()函数。在我的示例中,在按下“Enter”键之前输入任何其他字符将在暂停后恢复循环。

注意:小心使用Python的IDLE运行此代码。它不会起作用。相反,你必须从命令行运行它。


目前,我正在尝试弄清楚如何使当前脚本在用户按下“Enter”按钮时停止。大多数解决方案都需要输入,而在我的情况下并没有这样的输入。 - Mooni
结果问题有点棘手。我更新了我的解决方案!如果这是你需要的,请接受我的答案。 :) - ehusby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接