代码之家  ›  专栏  ›  技术社区  ›  Mooni

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

  •  3
  • Mooni  · 技术社区  · 7 年前

    我需要每隔10秒打印一句“你好,世界”。然而,若用户输入“c”或“Enter”,程序应该停止打印该句子,并提示用户提供另一个句子。检查用户提供的句子,如果句子包含任何数字,则会显示一条消息:“不能包含数字”。否则会显示一条消息:“正确的句子”。在显示任何一条消息后,程序继续打印“Hello World”。

    这是我使用的代码。如有任何关于如何继续的提示,我们将不胜感激。 谢谢

    import threading
    
    def looping():
        threading.Timer(10.0, looping).start()
        print("Hello World!")
    
    looping()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   ehusby    7 年前

    从我对你作业说明的理解来看,你用计时器打印“你好,世界”的做法似乎是对的!关于“线程和控制台输入/输出不能很好地协同工作”这句话,我想对伊尔曼·德容对你的问题的评论投赞成票,因为我自己在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的空闲来运行此代码。这行不通。相反,您必须从命令行运行它。