在多个if语句中使用相同的Python变量
我当前的Python脚本有问题。“progress”变量的用途是在通过一个if循环时获取特定值。但是,程序永远不会比第一个if语句更进一步。似乎每个if语句都会生成自己的变量“progress”。有人能帮我吗? 请参阅下面的代码在多个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
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