使用物理按钮在不同的循环之间切换(Raspberry / Python)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用物理按钮在不同的循环之间切换(Raspberry / Python)相关的知识,希望对你有一定的参考价值。

我想创建一个有两个循环的简单程序,我可以通过按下物理按钮来改变它们,就像模式选择器一样。

模式1:加热 模式2:冷却

import RPi.GPIO as GPIO
import time

GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)

mode = 'heating'

def my_callback(channel):
    if mode == 'heating'
        mode = 'cooling'
        print 'turned on cooling'
    elif mode == 'cooling'
        mode = 'heating'
        print 'turned on heating'

GPIO.add_event_detect(21, GPIO.RISING, callback=my_callback)


while mode == 'heating'
    print 'I am heating'
    time.sleep(1.0)

while mode == 'cooling'
    print 'I am cooling'
    time.sleep(1.0)

当我运行此代码时,它以加热模式启动,当我按下按钮时回调运行但变量没有改变且加热循环仍在运行。

答案

你不能在你的代码中顺序循环,否则即使一切正常,你也只能在程序终止前按两次按钮。你应该做更像这样的事情:

while True:
    if mode == 'heating':
        print 'I am heating'
        time.sleep(1.0)
    if mode == 'cooling':
        print 'I am cooling'
        time.sleep(1.0)
另一答案

@Ted Klein Bergman在回复中写下了工作答案:

模式变量必须在函数中定义为全局变量。这个修改解决了这个问题:

def my_callback(channel):
    if mode == 'heating'
        global mode
        mode = 'cooling'
        print 'turned on cooling'
    elif mode == 'cooling'
        global mode
        mode = 'heating'
        print 'turned on heating'

感谢您的反馈!

以上是关于使用物理按钮在不同的循环之间切换(Raspberry / Python)的主要内容,如果未能解决你的问题,请参考以下文章

使用数据在 2 个不同的 NSViewController 之间切换

使用闪亮动作按钮在两个表之间循环

python-vlc 在启动之间切换播放媒体

使用分段控制在 ios 中的视图之间切换视图

在 UserControl WPF MVVM caliburn 内的 UserControl 之间切换

如何从启动页面在不同的 tkinter 画布之间切换并返回子画布中的启动页面