【问题标题】:Break a while loop when a button is pressed按下按钮时中断while循环
【发布时间】:2022-01-25 17:03:52
【问题描述】:

我目前正在尝试设置此代码,以便当在这种情况下连接到 RPi GPIO 的按钮 button1 运行函数 c1 并继续循环该函数直到按下另一个按钮 button2 然后它运行函数c2 一直在该函数中循环。

    #Import RPi GPIO module
    from gpiozero import Button

    #Assign name to buttons GPIO pins
    button1 = Button(2)
    button2 = Button(4)

    def c1():
        while True:
            print('c1')
            grade = float(input('Select grade: '))
            if grade < 10:
            print('Less than 10')
        else:
            print ('invalid input')

   def c2():
       while True:
            print('c2')
            grade = float(input('Select grade: '))
            if grade < 10:
                print('Less than 10')
            else:
                print ('invalid input')

我遇到了破坏功能c1的麻烦,我尝试在while中添加一个break,当按下另一个按钮时没有任何运气,因为代码不会停止。

    def c1():
        while True:
            print('c1')
            grade = float(input('Select grade: '))
        if grade < 10:
            print('Less than 10')
        elif button2.is_pressed:
            break

我也试过这个来打破循环,但我什至不确定这是一个正确的方法,无论如何它没有工作。

    def c1():
        while True:
            print('c1')
            grade = float(input('Select grade: '))
            if grade < 10:
                print('Less than 10')
            elif button2.is_pressed:
                c1() == False
                break

我不确定是否正确,但我感觉必须更改功能让我们假设 c1 到 False 以打破循环。我希望通过在按下新按钮后告诉代码停止循环可以工作,但没有成功。

我在这里错过了什么?

【问题讨论】:

    标签: python python-3.x raspberry-pi gpiozero


    【解决方案1】:

    如果这是准确代码,那么您可能会注意到break 在while 循环之外。

    def c1():
        while True:
            print('c1')
            grade = float(input('Select grade: '))
        if grade < 10:
            print('Less than 10')
        elif button2.is_pressed:
            break
    

    同时,在此代码中,您需要在while 循环之前设置boolean 变量,然后将其设置为false。如果您使用此方法,则不需要 break,因为一旦将变量设置为 false,该函数将中断 while 循环。

    def c1():
        while True:
            print('c1')
            grade = float(input('Select grade: '))
            if grade < 10:
                print('Less than 10')
            elif button2.is_pressed:
                c1() == False
                break
    

    试试这个:

    def c1():
        flag = True
        while flag == True:
            print('c1')
            grade = float(input('Select grade: '))
            if grade < 10:
                print('Less than 10')
            elif button2.is_pressed: #try using if here instead of elif
                flag = False
    

    或者这个:

    def c1():
        while True:
            print('c1')
            grade = float(input('Select grade: '))
            if grade < 10:
                print('Less than 10')
            elif button2.is_pressed: #try using if here instead of elif
                break
    

    编辑:也许您错过了elif,如果不起作用,请尝试使用if。

    编辑 2:进一步的问题。

    def c1():
        while True:
            print('c1')
            if button2.is_pressed:
                break
            grade = float(input('Select grade: '))
            if grade < 10:
                print('Less than 10')
    

    【讨论】:

    • 您发布的最后一个代码完成了这项工作!尽管我按照您的建议将elif 更改为if。现在我想问为什么我需要两个if 语句?
    • elif 语句仅在if 语句首先满足条件时才有效。如果if 语句甚至没有被执行,它就不会工作。
    • 感谢您澄清这一点!我遇到了另一个问题。只有当我在input 提示期间输入值时按住按钮,代码才会中断。即使在等待输入,有什么方法可以让代码中断吗?
    • 这是否意味着按钮是优先的?
    • 我不确定我是否 100% 理解了这个问题,但是是的,当按下另一个按钮时,代码需要停止,不管任何事情并跳转到下一个代码。你觉得有可能吗?
    【解决方案2】:

    你调试过你的程序吗?你检查过break 被调用了吗?

    它可能会帮助您找到问题。

    您也可以打印:button2.is_pressed 以了解发生了什么。

    【讨论】:

    • 感谢您的回复,我已经进行了一些调试,但没有按照您的建议进行调试,如何打印break 以查看它是否被调用?下次可能有用
    • 您可以使用调试器(例如pycharm's debugger 或vscode's debugger),或者在break 行之前打印一条消息
    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2022-10-01
    • 2017-09-25
    • 2020-12-29
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多