您是否可以从内部函数停止主函数的运行

2024-06-03 13:09:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在进行一个项目,以无线方式控制我的新像素灯。在我的一个函数中有一个无限循环来创建彩虹效果。唯一的问题是,当需要调用下一个函数(即关闭灯)时,程序不会停止在第一个循环中循环。我想知道是否有可能通过内部函数停止函数的运行,以及如何执行。如果有人能给我帮助,我将不胜感激

提前感谢,, 亨利G

这是我的密码:

from flask import Flask
import board
import neopixel
import time

# Choose an open pin connected to the Data In of the NeoPixel strip, i.e. board.D18
pixel_pin = board.D18

# The number of LEDs
num_pixels = 20

# The order of the LED colors - RGB or GRB. Some LED Strips - like ours - have red and green reversed!
ORDER = neopixel.GRB

pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.7, auto_write=False, pixel_order=ORDER)

app = Flask(__name__)

rainOn = False
triggered = False
go = False

@app.route('/')
def index():
    return 'Hello world'

@app.route('/rgb/<r>/<g>/<b>')
def color(r, g, b):
    global go
    go = False
    global pixels
    pixels.fill((int(r), int(g), int(b)))
    pixels.show()
    return 'The color you have chosen is now showing!'

@app.route('/off')
def off():
    global go
    global rainOn
    rainOn = False
    go = False
    global pixels
    pixels.fill((0, 0, 0))
    pixels.show()
    return 'The lights are now off!'

@app.route('/rainbow')
def rainbow():
    global go
    global triggered
    global rainOn
    rainOn = True
    triggered = True
    go = True
    while go == True:
            def end():
                go = False
                return
            def wheel(pos):
                if pos < 0 or pos > 255:
                    r = g = b = 0
                elif pos < 85:
                    r = int(pos * 3)
                    g = int(255 - pos*3)
                    b = 0
                elif pos < 170:
                    pos -= 85
                    r = int(255 - pos*3)
                    g = 0
                    b = int(pos*3)
                else:
                    pos -= 170
                    r = 0
                    g = int(pos*3)
                    b = int(255 - pos*3)
                return (r, g, b) if ORDER == neopixel.RGB or ORDER == neopixel.GRB else (r, g, b, 0)
            def rainbow_cycle(wait):
                global rainOn
                global triggered
                global go
                if go == True and triggered == True and rainOn == True:
                    for j in range(255 ** 255):
                        for i in range(num_pixels):
                            pixel_index = (i * 256 // num_pixels) + j
                            pixels[i] = wheel(pixel_index & 255)
                        pixels.show()
                        time.sleep(wait)
                elif go == False or triggered == False or rainOn == False:
                    end()

            while rainOn == True and triggered == True and go == True:

                rainbow_cycle(0.0035)
                return 'Rainbow off'
    return 'Done'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

Tags: orposfalsetrueappgoreturndef