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

时间:2015-06-09 11:57:08

标签: python if-statement raspberry-pi global-variables bottle

我遇到了当前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)                        

3 个答案:

答案 0 :(得分:5)

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

因此,改变其中一个分支中的progress将不会导致其他分支被选中。

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

但是,您使用return语句在每个分支中完全退出视图。您的函数将无法继续,退出循环并且下一个请求将始终再次从头开始(您设置progress = 0。如果{{1}在服务器中应该是一个全局状态,你应该这样设置它。请注意,这不是线程安全的,如果使用使用多处理的WSGI服务器,那么该变量也不会在进程间共享扩大规模。

由于您正在控制一块硬件,使用全局可能没问题,但是您需要将WSGI服务器限制为仅运行一个线程,或者您需要使用锁定将此视图限制为一个线程。时间。

要使progress全局,请在函数顶部添加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调用已消失。您必须将Javascript放在响应中,而不是在超时后重新加载页面。

答案 1 :(得分:0)

return template('index.html')退出该功能吗?由于您始终将progress变量初始化为o,因此始终执行该变量,并在结束时退出。

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

答案 2 :(得分:0)

根据瓶子文件return template('')将返回模板并在此“/”中停止该功能

变量progress是一个局部变量,除了初始化之外,你没有在程序中分配任何变量

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