【问题标题】:Python Loop CapabilityPython 循环能力
【发布时间】:2018-08-03 01:10:58
【问题描述】:

我正在尝试在树莓派上为我的学校项目编写一个程序。程序概念相当简单。 pi 正在查看 4 个 GPIO 引脚输入,并将根据输入向 LED 矩阵输出不同的基本动画。

主循环是一个始终运行的简单 while(1) 循环。在这个循环中,程序不断检查 pi 上的 4 个 GPIO 输入引脚的输入。当输入与其中一个 if 语句匹配时,它会运行一个简短的“动画”,其中在 LED 矩阵上显示一个图像,等待,清除矩阵,显示另一个图像,等待,然后再次清除。例如,这可以是“闪烁的笑脸”动画,其中显示的第一张图像是睁着眼睛的笑脸,第二张图像是闭着眼睛的笑脸。随着显示图片之间的暂停,屏幕上的图像似乎实际上在闪烁。

为清楚起见,下面显示了此设置(不是实际代码,但可以理解):

while(1) {

    currentState = [GPIO.input(pin1), GPIO.input(pin2), GPIO.input(pin3), GPIO.input(pin4)]

    if((currentState[0] == 1) and (currentState[1] == 0) and (currentState[2] == 1) and (currentState[3] == 0)) {
        matrix.SetImage(open_eyes)
        time.sleep(.3)
        matrix.Clear()
        matrix.SetImage(closed_eyes)
        time.sleep(.3)
        matrix.Clear()
    }

    if((currentState[0] == 0) and (currentState[1] == 1) and (currentState[2] == 0) and (currentState[3] == 1)) {
        matrix.SetImage(closed_mouth)
        time.sleep(.3)
        matrix.Clear()
        matrix.SetImage(open_mouth)
        time.sleep(.3)
        matrix.Clear()
    }
}

我在此设置中遇到的问题是,如果输入在动画期间发生变化,那么它不会切断当前正在播放的动画以开始下一个动画。这很明显是代码的结构方式,因为 currentState 变量仅在 while 循环的开头设置。

为了完成这个立即 切换,我尝试让每个动画都成为一个函数,并在 if 语句中运行该函数。但是,程序永远不会跳出这些函数来检查输入是什么。我现在被困住了,如果有人对如何实现这一点有任何想法,我很想听听他们的意见。

【问题讨论】:

标签: python while-loop nested


【解决方案1】:

这里的问题是 time.sleep。在睡眠期间,程序不会检测到 currentState 的更改 - 正如您正确识别的那样。处理此问题的一种方法(我不会为您编写代码,但会解释总体思路),是将您的动画状态保持在一个对象中,该对象在每个 while 循环周期都会更新。事情变得比你所拥有的要复杂一些,因为你需要使用某种时间监控来跟踪 0.3 秒。因此,您可以将对象状态设置为:

animation.state = 'blinking' 
animation.started = datetime.now()

然后,一旦你检测到 0.3 秒过去了,你就可以改变你的动画状态。如果 currentState 发生变化,您可以重置动画状态。

或者,您可以为动画生成一个线程。这在某些方面是很自然的(例如在 Go 中很容易),但如果你不习惯 Python 线程,那就有点棘手了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多