在多个 if 语句中使用相同的 Python 变量

Use same Python variable in multiple if-statements

我当前的 Python 脚本有问题。 'progress' 变量的目的是在它通过一个 if 循环时取一个特定的值。但是,程序永远不会比第一个 if 语句更进一步。看起来好像每个 if 语句都有自己的变量 'progress'。有人可以帮帮我吗? 请参阅下面的代码。

from bottle import run, route, template, error, static_file     
import RPi.GPIO as GPIO                         
import time                             

switch1 = 21        
switch2 = 20        
switch3 = 26        
switch4 = 16        
switch5 = 19        

led1 = 13       
led2 = 12       
led3 = 6        
led4 = 5        
led5 = 25       

GPIO.setmode(GPIO.BCM)                          

GPIO.setup(switch1, GPIO.IN, pull_up_down=GPIO.PUD_UP)          
GPIO.setup(switch2, GPIO.IN, pull_up_down=GPIO.PUD_UP)          
GPIO.setup(switch3, GPIO.IN, pull_up_down=GPIO.PUD_UP)          
GPIO.setup(switch4, GPIO.IN, pull_up_down=GPIO.PUD_UP)          
GPIO.setup(switch5, GPIO.IN, pull_up_down=GPIO.PUD_UP)          

GPIO.setup(led1, GPIO.OUT)                      
GPIO.setup(led2, GPIO.OUT)                      
GPIO.setup(led3, GPIO.OUT)                      
GPIO.setup(led4, GPIO.OUT)                      
GPIO.setup(led5, GPIO.OUT)                      


@route("/")
def hello():
    progress = 0
    while True:
        if progress == 0:
            GPIO.output(led1, False)
            GPIO.output(led2, False)
            GPIO.output(led3, False)
            GPIO.output(led4, False)
            GPIO.output(led5, False)

            progress = 1    
            return template('index.html')

        if (not GPIO.input(switch1)) and progress == 1:     
            GPIO.output(led1, True)
            progress = 2
            return template('video1.html')

        elif (not GPIO.input(switch2)) and progress == 2:   
            GPIO.output(led1, False)
            GPIO.output(led2, True)
            progress = 3
            return template('video2.html')

        elif (not GPIO.input(switch3)) and progress == 3:   
            GPIO.output(led2, False)
            GPIO.output(led3, True)
            progress = 4
            return template('video3.html')

        elif (not GPIO.input(switch4)) and progress == 4:   
            GPIO.output(led3, False)
            GPIO.output(led4, True)
            progress = 5
            return template('video4.html')

        elif (not GPIO.input(switch5)) and progress == 5:   
            GPIO.output(led4, False)
            GPIO.output(led5, True)
            progress = 6
            return template('video5.html')

        elif progress == 6:
            while True:                     
                GPIO.output(led1, True)
                GPIO.output(led2, True)
                GPIO.output(led3, True)
                GPIO.output(led4, True)
                GPIO.output(led5, True)
                time.sleep(0.5)
                GPIO.output(led1, False)
                GPIO.output(led2, False)
                GPIO.output(led3, False)
                GPIO.output(led4, False)
                GPIO.output(led5, False)
                time.sleep(0.5)

                return template('succes.html')

        elif GPIO.input(switch1) and GPIO.input(switch2) and GPIO.input(switch3) and GPIO.input(switch4) and GPIO.input(switch5):
             time.sleep(0.15)  


        else:                           
            GPIO.output(led1, False)
            GPIO.output(led2, False)
            GPIO.output(led3, False)
            GPIO.output(led4, False)
            GPIO.output(led5, False)

            return template('false.html')

        time.sleep(0.05)                    

@route('/<filename>')                           
def server_static(filename):
    return static_file(filename, root='static')

@error(404)                             
def error404(error):
    return("Nothing here, keep searching!")

run(host='0.0.0.0', port=80)                        

您正在使用 if...elif...。 Python 将选择 一个 匹配测试(第一个 ifelif 测试匹配),并且永远不会 运行 其他分支。

因此,在这些分支之一中更改 progress 不会导致其他分支之一被选中。

如果要分开测试,则不应为每个分支使用 elif,而应使用 if

但是,您使用 return 语句在每个分支中完全退出视图。你的函数将不继续,退出循环,下一个请求将总是重新开始(你设置progress = 0的地方) 。如果 progress 是服务器中的全局状态,则应将其设置为这样。请注意,这不是线程安全的,如果您使用,该变量也不会跨进程共享使用多处理扩展的 WSGI 服务器。

因为你控制的是一个硬件,使用全局可能没问题,但是你需要将你的 WSGI 服务器限制为 运行 只有一个线程,或者你需要使用锁定来限制它一次查看一个线程。

要使 progress 全局化,请在函数顶部添加 global progress,然后将 progress = 0 放在函数 之外:

progress = 0

@route("/")
def hello():
    global progress
    if progress == 0:
        GPIO.output(led1, False)
        GPIO.output(led2, False)
        GPIO.output(led3, False)
        GPIO.output(led4, False)
        GPIO.output(led5, False)

        progress = 1    
        return template('index.html')

    if (not GPIO.input(switch1)) and progress == 1:     
        GPIO.output(led1, True)
        progress = 2
        return template('video1.html')

    elif (not GPIO.input(switch2)) and progress == 2:   
        GPIO.output(led1, False)
        GPIO.output(led2, True)
        progress = 3
        return template('video2.html')

    elif (not GPIO.input(switch3)) and progress == 3:   
        GPIO.output(led2, False)
        GPIO.output(led3, True)
        progress = 4
        return template('video3.html')

    elif (not GPIO.input(switch4)) and progress == 4:   
        GPIO.output(led3, False)
        GPIO.output(led4, True)
        progress = 5
        return template('video4.html')

    elif (not GPIO.input(switch5)) and progress == 5:   
        GPIO.output(led4, False)
        GPIO.output(led5, True)
        progress = 6
        return template('video5.html')

    elif progress == 6:
        while True:                     
            GPIO.output(led1, True)
            GPIO.output(led2, True)
            GPIO.output(led3, True)
            GPIO.output(led4, True)
            GPIO.output(led5, True)
            time.sleep(0.5)
            GPIO.output(led1, False)
            GPIO.output(led2, False)
            GPIO.output(led3, False)
            GPIO.output(led4, False)
            GPIO.output(led5, False)
            time.sleep(0.5)

            return template('succes.html')

    elif GPIO.input(switch1) and GPIO.input(switch2) and GPIO.input(switch3) and GPIO.input(switch4) and GPIO.input(switch5):
         time.sleep(0.15)  


    else:                           
        GPIO.output(led1, False)
        GPIO.output(led2, False)
        GPIO.output(led3, False)
        GPIO.output(led4, False)
        GPIO.output(led5, False)

        return template('false.html')

请注意,while 循环和 sleep() 调用已消失。您必须将 Javascript 放入响应中,而不是在超时后重新加载页面。

return template('index.html')不是在退出函数吗?由于您始终将 progress 变量初始化为 o,所以第一个 if 总是执行并在最后退出。

您必须在单独的函数中初始化 GPIO.output,然后您可以测试 GPIO.input 的值。不需要 progress 变量。

根据 bottle 文档 return template('') 将 return 模板并停止此“/”中的那个函数

变量progress是一个局部变量除了初始化

你还没有在程序内部赋值任何变量

您已将其分配给 0,因此始终会执行第一个 if 语句