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

时间:2017-11-06 20:58:39

标签: python keypress prompt

我需要打印句子" Hello World"每10秒钟。但是,如果用户要么' c'或者'输入'程序应该停止打印句子并提示用户提供另一个句子。检查用户提供的句子,如果句子包含任何数字,则会显示一条消息:"不能包含数字"。否则会显示一条消息:"正确的句子"。在显示任一消息后,程序继续打印" Hello World"。

这是我用过的代码。关于如何继续进一步的任何提示将不胜感激。 谢谢!

import threading

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

looping()

1 个答案:

答案 0 :(得分:1)

根据我对你的作业说明的理解,看起来你正在使用计时器打印“Hello World”!我想就你所提出的关于“线程与控制台输入/输出不能很好地协同工作”这一陈述的问题发表评论,因为我自己在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'键)取自我之前链接到的stackoverflow问题回答。只要您使用Python for Windows(因此您安装了MS VC ++运行时库msvcrt),这应该可以正常工作,但是为了在按下“Enter”时停止脚本,您可以使用标准{{1}功能。在我的示例中,在按“Enter”之前键入任何其他字符串将在暂停后继续循环。

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