变量等于x时触发事件-python

变量等于x时触发事件-python,python,python-3.x,variables,raspberry-pi,Python,Python 3.x,Variables,Raspberry Pi,我有下面的脚本,每次按下按钮都会增加计数器。当计数器达到某个数字,即10时,让我们假设我希望触发一个事件 from RPi import GPIO from time import sleep clk = 25 dt = 8 GPIO.setmode(GPIO.BCM) GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) counte

我有下面的脚本,每次按下按钮都会增加计数器。当计数器达到某个数字,即10时,让我们假设我希望触发一个事件

from RPi import GPIO
from time import sleep

clk = 25
dt = 8

GPIO.setmode(GPIO.BCM)
GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

counter = 0
clkLastState = GPIO.input(clk)

try:
        while True:
                clkState = GPIO.input(clk)
                dtState = GPIO.input(dt)
                if clkState != clkLastState:
                        if dtState != clkState:
                                counter += 1
                        else:
                                counter -= 1
                        print counter
                clkLastState = clkState
                sleep(0.01)
finally:
                GPIO.cleanup()
对于示例脚本而言,最简单的方法可能是让它在达到所需数量时打印一些内容,即“达到目标”

这个问题与我之前在这里的一个帖子有关-。我认为,与其补充或修正这个问题,不如将问题分解,以便了解各个组成部分


非常感谢

如果您想在赋值时执行(有条件的)操作,您希望它成为一个对象属性,您可以将赋值劫持到该属性。重载
\uuuu setattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。例如:

class C:
    def __init__(self, trigger, init_val=0):
        self._v = init_val
        self.trigger = trigger

    @property
    def v(self):
        return self._v

    @v.setter
    def v(self, value):
        if value == self.trigger:
            print("Trigger {} hit, perform some action.".format(value))
        else:
            print("Nothing to do for {}".format(value))
        self._v = value

c = C(10)
while c.v < 12:  # Go couple turns past the "event" to see its effect
    c.v += 1
C类:
定义初始值(自、触发器、初始值=0):
self.\u v=初始值
self.trigger=触发器
@财产
def v(自我):
返回自我
@v、 塞特
def v(自身,值):
如果值==self.trigger:
打印(“触发器{}点击,执行一些操作。”.format(value))
其他:
打印(“对{}不做任何事”。格式(值))
自我价值
c=c(10)
当c.v<12时:#Go Course转过身去看“事件”的效果
c、 v+=1
我怀疑在这两个问题中,你真正想要的是运行两个循环,这样你就可以继续计算开关事件,并控制电机的旋转,直到后者在达到前者的阈值后停止。有更多的方法来实现这一点,例如,想到线程。在下面的示例中,我让计数器在单独的线程中运行,并让马达循环检查计数器的进度:

from threading import Thread
from time import sleep

class Counter(Thread):
    def __init__(self, limit):
        self.value = 0
        self.limit = limit
        super().__init__()

    def run(self):
        while self.value < self.limit:
            # We'd be acquiring and accumulating actual values here         
            sleep(1)
            self.value += 1
            print("Counter now at {}".format(self.value))

counter = Counter(10)
counter.start()
while counter.value < counter.limit:
    print("Spinning motor")
    sleep(0.5)  # do actual work here
print("Stop motor")
从线程导入线程
从时间上导入睡眠
类计数器(线程):
定义初始(自我,限制):
self.value=0
self.limit=限制
super()。\uuuu init\uuuuu()
def运行(自):
当self.value

您可以组合这两个示例,也可以在自己的线程中运行/或马达控制。然而,如果轮询开关和旋转电机发生在同一频率,则只需保持计数并将其值与单个回路中的限制值进行比较,就会简单得多。如果电机通过一个动作启动,并且在达到极限时需要通过另一个动作停止,只需启动,在开关上循环,并在循环完成后停止。

没有内置方法可以做到这一点-最简单的方法是在修改
计数器时检查新值是否为10(如果
,则使用简单的
)然后你会触发你的事件。另请参见,例如:谢谢。我也许应该指出我在这里找到了这个脚本-虽然它在计算中起作用,但我真的不知道如何修改它以使其达到我想要的效果。也许我应该在该网站上发布,因为它可能对像我这样的初学者更有帮助y、 可能也会有帮助非常感谢!是的非常贴切。非常感谢您的详细回复。我确实找到了解决方案,可以通过专门的raspberry pi stack exchange论坛实现我的目标,正如前面所建议的那样。链接到这里-[link]().尽管如此,我还是基于你的回答的彻底性而接受了你的回答。我也会记住这一点,作为另一种解决办法。