我目前的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将选择一个匹配的测试(第一个要匹配的if
或elif
测试),并且永远不会运行其他分支。
因此,改变其中一个分支中的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
变量