Python:检测特定按键并提示用户
Python: detect specific key press and prompt the user
我需要每 10 秒打印一次句子 "Hello World"。但是,如果用户 'c' 或 'Enter',程序应该停止打印句子并提示用户提供另一个句子。检查用户提供的句子,如果该句子包含任何数字,则会显示一条消息:"cannot contain digits"。否则会显示一条消息:"correct sentence"。在显示任何一条消息后,程序继续打印 "Hello World"。
这是我制定的代码。将不胜感激任何关于如何继续的提示。
谢谢!
import threading
def looping():
threading.Timer(10.0, looping).start()
print("Hello World!")
looping()
根据我对您的作业说明的理解,使用计时器打印 "Hello World" 看来您的方向是正确的!我想赞成 Irmen de Jong 对你关于陈述 "threads and console input/output don't work nicely together" 的问题的评论,因为我自己在 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' 键)取自我链接的 Whosebug 问题在我之前的回答中。只要您将 Python 用于 Windows(因此您安装了 MS VC++ 运行time 库 msvcrt
),这应该可以工作,但是要在按 'Enter' 时停止脚本,您可以使用标准的 input()
函数。在我的示例中,在按 'Enter' 之前键入任何其他字符串将在暂停后恢复循环。
注意:注意不要将 Python 的 IDLE 用于 运行 此代码。它不会工作。相反,您必须从命令行 运行 它。
我需要每 10 秒打印一次句子 "Hello World"。但是,如果用户 'c' 或 'Enter',程序应该停止打印句子并提示用户提供另一个句子。检查用户提供的句子,如果该句子包含任何数字,则会显示一条消息:"cannot contain digits"。否则会显示一条消息:"correct sentence"。在显示任何一条消息后,程序继续打印 "Hello World"。
这是我制定的代码。将不胜感激任何关于如何继续的提示。 谢谢!
import threading
def looping():
threading.Timer(10.0, looping).start()
print("Hello World!")
looping()
根据我对您的作业说明的理解,使用计时器打印 "Hello World" 看来您的方向是正确的!我想赞成 Irmen de Jong 对你关于陈述 "threads and console input/output don't work nicely together" 的问题的评论,因为我自己在 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' 键)取自我链接的 Whosebug 问题在我之前的回答中。只要您将 Python 用于 Windows(因此您安装了 MS VC++ 运行time 库 msvcrt
),这应该可以工作,但是要在按 'Enter' 时停止脚本,您可以使用标准的 input()
函数。在我的示例中,在按 'Enter' 之前键入任何其他字符串将在暂停后恢复循环。
注意:注意不要将 Python 的 IDLE 用于 运行 此代码。它不会工作。相反,您必须从命令行 运行 它。