在 Python 中使用具有多个条件的时间时出错

Error when using time with multiple conditions in Python

问题是,变量t1在循环内部,但我不能在外部使用它(因为它没有定义);所以程序returns "UnboundLocalError: local variable 't1' referenced before assignment"。我不知道其他方法来衡量这两个事件之间的时间,每次第一次开始时(用下面的代码自我解释)。

if status in STATUSON:
        t1 = 0
        GPIO.output(17,GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(17,GPIO.LOW)
        return statement('Ok')
        t1 = time.time()
    elif status in STATUSOFF and time.time() - t1 >= 5:
        GPIO.output(17,GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(17,GPIO.LOW)
        return statement('Ok')
    elif status in STATUSOFF and time.time() - t1 <= 5:
        GPIO.output(17,GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(17,GPIO.LOW)
        time.sleep(2)
        GPIO.output(17,GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(17,GPIO.LOW)
        return statement('Ok')

您的问题在这里:

        return statement('Ok')
        t1 = time.time()

您 return 在 设置 t1 变量之前 。尝试反转这两行。

此外,当你使用 return 语句时,我猜你在一个函数中,然后你应该 return t1 变量(也许使用元组?) ,或将其设置为全局变量(不太推荐),以便能够在 main/top 函数中进行计算。

已解决:

我用pickle解决了这个问题。它可以将 Python 个对象转换为字符流,并保存它,以便下一个循环可以随时访问此数据(下面的新代码)。

    if status in STATUSON:
        t1 = time.time()
        with open('time.pickle', 'wb') as f:
            pickle.dump(t1, f)       
        GPIO.output(17,GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(17,GPIO.LOW)
        return statement('Ok')
    elif status in STATUSOFF:
        with open('time.pickle', 'rb') as f:
            t1 = pickle.load(f)        
        if time.time() - t1 >= 15:
            GPIO.output(17,GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(17,GPIO.LOW)
            open("time.pickle", "w").close()
            return statement('Ok')
        elif time.time() - t1 <= 15:
            GPIO.output(17,GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(17,GPIO.LOW)
            time.sleep(2)
            GPIO.output(17,GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(17,GPIO.LOW)
            return statement('Ok')
        else:
            GPIO.output(17,GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(17,GPIO.LOW)
            return statement('Ok')

完整代码: old, new