我需要每 10 秒打印一次“Hello World”。但是,如果用户选择“c”或“Enter”,程序应停止打印句子并提示用户提供另一个句子。检查用户提供的句子,如果该句子包含任何数字,则会显示一条消息:“不能包含数字”。否则会显示一条消息:“正确的句子”。在显示任何一条消息后,程序继续打印“Hello World”。
这是我已经制定的代码。将不胜感激任何关于如何继续的提示。 谢谢!
import threading
def looping():
threading.Timer(10.0, looping).start()
print("Hello World!")
looping()
最佳答案
根据我对您的作业说明的理解,您使用计时器打印“Hello World”似乎是在正确的轨道上!我想赞成 Irmen de Jong 对你关于“线程和控制台输入/输出不能很好地协同工作”这一说法的问题的评论,因为我自己在 C 编程中经历过这一点。
一旦计时器启动,它打印到屏幕上的文本就不会影响对键盘输入的响应。如果确实需要直接响应“c”的按键(不后跟“Enter”,因为在使用 input()
从键盘读取输入时通常必须这样做),我建议按照 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
时,将在调用 looping
时停止启动新的计时器实例,从而停止该函数的所有进一步重复,直到 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()
在最后一个代码块中注释掉的是一种直接获取按键的方法(无需按 input()
要求的“Enter”键),取 self 在回答的前面链接到的 stackoverflow 问题。只要您使用 Python for Windows(因此您安装了 MS VC++ 运行时库 msvcrt
),这应该就可以工作,但是要在按“Enter”时停止脚本,您可以使用标准的 input()
函数。在我的示例中,在按“Enter”之前键入任何其他字符串将在暂停后恢复循环。
注意:请注意不要使用 Python 的 IDLE 来运行此代码。它不会工作。相反,您必须从命令行运行它。
关于Python:检测特定的按键并提示用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47145673/