Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多个if语句中使用相同的Python变量_Python_If Statement_Raspberry Pi_Global Variables_Bottle - Fatal编程技术网

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

在多个if语句中使用相同的Python变量,python,if-statement,raspberry-pi,global-variables,bottle,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

我当前的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)                        
从瓶子导入运行、路线、模板、错误、静态文件
将RPi.GPIO导入为GPIO
导入时间
开关1=21
开关2=20
开关3=26
开关4=16
开关5=19
led1=13
led2=12
led3=6
led4=5
led5=25
GPIO.setmode(GPIO.BCM)
GPIO.setup(开关1,GPIO.IN,上拉下拉=GPIO.PUD上拉)
GPIO.setup(开关2,GPIO.IN,上拉下=GPIO.PUD上拉)
GPIO.setup(开关3,GPIO.IN,上拉下拉=GPIO.PUD上拉)
GPIO.setup(开关4,GPIO.IN,上拉下拉=GPIO.PUD上拉)
GPIO.setup(开关5,GPIO.IN,上拉下=GPIO.PUD上拉)
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)
@路线(“/”)
def hello():
进度=0
尽管如此:
如果进度==0:
GPIO.output(led1,False)
GPIO.output(led2,False)
GPIO.output(led3,False)
GPIO.output(led4,False)
GPIO.output(led5,False)
进度=1
返回模板('index.html')
如果(不是GPIO.input(开关1))和进度==1:
GPIO.output(led1,真)
进度=2
返回模板('video1.html')
elif(非GPIO.input(开关2))和进度==2:
GPIO.output(led1,False)
GPIO.输出(led2,真)
进度=3
返回模板('video2.html')
elif(非GPIO.input(开关3))和进度==3:
GPIO.output(led2,False)
GPIO.输出(led3,真)
进度=4
返回模板('video3.html')
elif(非GPIO.input(开关4))和进度==4:
GPIO.output(led3,False)
GPIO.输出(led4,真)
进度=5
返回模板('video4.html')
elif(非GPIO.input(开关5))和进度==5:
GPIO.output(led4,False)
GPIO.输出(led5,真)
进度=6
返回模板('video5.html')
elif进度==6:
尽管如此:
GPIO.output(led1,真)
GPIO.输出(led2,真)
GPIO.输出(led3,真)
GPIO.输出(led4,真)
GPIO.输出(led5,真)
睡眠时间(0.5)
GPIO.output(led1,False)
GPIO.output(led2,False)
GPIO.output(led3,False)
GPIO.output(led4,False)
GPIO.output(led5,False)
睡眠时间(0.5)
返回模板('succes.html')
elif GPIO.input(开关1)和GPIO.input(开关2)以及GPIO.input(开关3)和GPIO.input(开关4)和GPIO.input(开关5):
睡眠时间(0.15)
其他:
GPIO.output(led1,False)
GPIO.output(led2,False)
GPIO.output(led3,False)
GPIO.output(led4,False)
GPIO.output(led5,False)
返回模板('false.html')
睡眠时间(0.05)
@路由(“/”)
def服务器_静态(文件名):
返回静态文件(文件名,root='static')
@错误(404)
def error404(错误):
return(“此处无任何内容,继续搜索!”)
运行(主机=0.0.0.0',端口=80)

您正在使用
if…elif…
。Python将选择一个匹配测试(要匹配的第一个
if
elif
测试),而从不运行其他分支

因此,更改其中一个分支中的
进度
,不会导致拾取其他分支中的一个

如果测试是分开的,则不应为每个分支使用
elif
,而应使用
If

但是,您可以使用
return
语句在每个分支中完全退出视图。您的功能将不会继续,循环将退出,下一个请求将始终从开始处再次启动(设置
progress=0
。如果
progress
是服务器中的全局状态,则应将其设置为全局状态。请注意,这不会是线程安全的,如果使用使用使用多处理进行扩展的WSGI服务器,该变量也不会在进程之间共享

由于您正在控制一块硬件,因此使用全局线程可能很好,但是您需要约束WSGI服务器只运行一个线程,或者需要使用锁定将此视图限制为一次只运行一个线程

要使
进度
全局化,请在函数顶部添加
全局进度
,并将
进度=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放入响应中,以在超时后重新加载页面。

您使用的是
if…elif…
。Python将选择一个匹配测试(第一个
if
elif
测试以匹配),并且永远不要运行其他分支

因此,更改其中一个分支中的
进度
,不会导致拾取其他分支中的一个

如果测试是分开的,则不应为每个测试使用
elif
,而应使用
If