从我对你作业说明的理解来看,你用计时器打印“你好,世界”的做法似乎是对的!关于“线程和控制台输入/输出不能很好地协同工作”这句话,我想对伊尔曼·德容对你的问题的评论投赞成票,因为我自己在C编程中也经历过这种情况。
一旦计时器启动,它打印到屏幕上的文本就不会影响对键盘输入的响应。如果真的需要直接响应“c”键(而不是紧跟“回车”键),通常在使用
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
调用,从而停止函数的所有进一步重复,直到
暂停循环
设置回
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()
在最后一个代码块中注释掉的是一种直接抓取按键的方法(无需按
输入()
)摘自我在前面的回答中链接到的stackoverflow问题。只要您使用Python for Windows(因此您有MS VC++runtime库),这应该可以工作
msvcrt
但要在按下“Enter”键时停止脚本,可以使用标准
输入()
作用在我的示例中,在按下“Enter”之前键入任何其他字符串将在暂停后恢复循环。
注意:小心使用Python的空闲来运行此代码。这行不通。相反,您必须从命令行运行它。