如何使用命令中断“while True”循环?

2024-10-03 02:32:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个简单的计时器程序,它应该在你告诉它时关闭(使用SpeechRecognition模块),但到目前为止,它只在听你说话时关闭,然后继续运行(它以“听,声音报警,重复”的方式重复)

报警功能如下所示:

def alarms():
while True:
    h1 = '08:00 AM'
    h2 = '01:00 PM'
    h3 = '08:30 PM'
    t = time.strftime('%I:%M %p')
    text = record_audio()
    while t == h1 or t == h2 or t == h3:
        ps('alarm.mp3')
        time.sleep(1)
        if turn_off(text):
            print("hello")                      #This was just to test if it was listening to me
            break

如果您还需要“关闭”部分的功能,请参见:

    offWords = ['stop', 'will stop', 'i\'m here', 'turn off']
    text = text.lower()

    for phrase in offWords:                    #determines if what you said includes anything in the list
        if phrase in text:
            return True
    return False 

我还没有尝试过其他的方法,因为我还是一个初学者,但我觉得这里有比我现在做的更有效的方法。该程序还有两个其他错误:

  1. 当你运行程序时,它会在警报响起之前等待你说些什么(警报应该是第一个弹出的东西)
  2. 如果您说的不是“offWords”变量列表中的短语,则警报将运行,但不再停止收听

我不知道他们是否与主要问题联系在一起,但为了安全起见,我将他们包括在内。我昨天花了一整天的时间试图解决这个问题,任何帮助都将不胜感激


Tags: textin程序功能true报警iftime
1条回答
网友
1楼 · 发布于 2024-10-03 02:32:37

这里的问题是“break”只从一个循环中逃逸;有两个嵌套循环。因此,要从外部循环中退出,需要在外部循环中添加一个条件。比如说:

def alarms():
    on = True
    while on:
        h1 = '08:00 AM'
        h2 = '01:00 PM'
        h3 = '08:30 PM'
        t = time.strftime('%I:%M %p')
        text = record_audio()
        while t == h1 or t == h2 or t == h3:
            ps('alarm.mp3')
            time.sleep(1)
            if turn_off(text):
                on = False
                print("hello")
                break

现在,你要检查的不是“while true”,而是闹钟是否还在响。或者,由于此函数上没有其他内容,您可以返回:

def alarms():
    while True:
        h1 = '08:00 AM'
        h2 = '01:00 PM'
        h3 = '08:30 PM'
        t = time.strftime('%I:%M %p')
        text = record_audio()
        while t == h1 or t == h2 or t == h3:
            ps('alarm.mp3')
            time.sleep(1)
            if turn_off(text):
                print("hello")
                return

这是一个有点烦人的问题,因为有时候你想逃离更复杂的嵌套循环,这样的修改并不总是那么实用;最后,您需要在外循环上附加一个“if not on:break”来进行检查

为了解决这个问题,一些语言为您提供了“带标签的循环”或“中断”,以便您可以指定要转义的循环或要转义的循环数;但是,如果滥用这些代码,代码就不那么清晰,这就是为什么Python did not include this feature

顺便说一句,你的第一个问题是因为你试图在闹钟响之前录音——你可能想在开始录音之前至少响一次。对于第二个问题,考虑一下内部循环:你会一直呆在它里面,对吗?所以你要在里面录音,而不是在外面

相关问题 更多 >