gpt4 book ai didi

python - 从一个枚举状态移动到下一个并循环

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:43 25 4
gpt4 key购买 nike

我只有具有 3 种模式 ledOn、ledBlink、ledOFF 的枚举器,并且我有一个可变模式来跟踪特定对象的模式。因此,例如,我有一个以 ledOn 模式启动的 LED,例如,我想在 5 秒后移动到下一个元素,即 ledBlink,然后到 ledOFF,然后循环到 ledON,有没有一种简单的方法可以实现这样的目标?

import time
from threading import Thread
from enum import Enum

class ledController(Thread):
ledModes = Enum('ledModes', 'ledON ledBlink ledOFF')
def __init__(self, GPIOID, state=False, blinkDuration=2, mode=ledModes.ledON):
self.GPIOID = GPIOID
self.state = state
self.blinkDuration = blinkDuration
self.mode = mode
self.blinked = False
Thread.__init__(self)
def run(self):
if(self.mode == self.ledModes.ledON):
self.ledON()
if(self.mode == self.ledModes.ledBlink):
self.ledBlink()
if(self.mode == self.ledModes.ledOFF):
self.ledOFF()
time.sleep(self.blinkDuration)
self.mode.next()
def ledSwitch(self):
self.state = not self.state
print(self.ledDetails())
def ledON(self):
self.state = True
print(self.ledDetails())
def ledOFF(self):
self.state = False
print(self.ledDetails())
def ledBlink(self, duration):
self.ledON()
print(self.ledDetails())
time.sleep(self.Blinkduration)
self.ledOFF()
print(self.ledDetails())
time.sleep(self.Blinkduration)
def ledDetails(self):
return "Thread: "+self.getName()+", LED: "+str(self.GPIOID)+", State: "+str(self.state)+", Mode: "+str(self.mode.name)+", Blink duration: "+str(self.blinkDuration)

redLED = ledController(17, blinkDuration = 3)
blueLED = ledController(18, mode = ledController.ledModes.ledOFF)

redLED.setName('1')
blueLED.setName('2')

redLED.start()
blueLED.start()

redLED.join()
blueLED.join()

最佳答案

我只会使用 itertools.cycle而不是你的枚举:

>>> from itertools import cycle
>>> ledModes = cycle(['ledON', 'ledBlink', 'LedOFF'])
>>> first = next(ledModes)
>>> second = next(ledModes)
>>> third = next(ledModes)
>>> fourth = next(ledModes)
>>>
>>> first
'ledON'
>>> second
'ledBlink'
>>> third
'LedOFF'
>>> fourth
'ledON'
>>>

仅供引用,您可以执行 next(ledModes)ledModes.next(),两者的作用相同。

编辑:您可以使用类似这样的东西作为您类(class)的方法:

from itertools import cycle

def initialize_cycle(start_mode):
states = ['ledON', 'ledBlink', 'ledOFF']

if start_mode not in states:
raise ValueError('start_mode invalid')

iterable = cycle(states)
for _ in states[:states.index(start_mode)]:
iterable.next()

return iterable

test1 = initialize_cycle('ledON')
test2 = initialize_cycle('ledOFF')
test3 = initialize_cycle('ledBlink')

# validation
for test in test1, test2, test3:
for _ in range(5):
print test.next()
print '-' * 20

输出:

$ python cycle.py
ledON
ledBlink
ledOFF
ledON
ledBlink
--------------------
ledOFF
ledON
ledBlink
ledOFF
ledON
--------------------
ledBlink
ledOFF
ledON
ledBlink
ledOFF
--------------------

关于python - 从一个枚举状态移动到下一个并循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36828526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com