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



我目前的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('')将返回模板并在此"/"

中停止该函数

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

之外,您没有在程序中为该变量赋值。

你已经将它分配给0,所以第一条if语句将一直被执行

是不是return template('index.html')退出功能?由于您将progress变量初始化为0,因此第一个if总是被执行并在最后退出。

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

相关内容

  • 没有找到相关文章

最新更新