【发布时间】:2018-05-08 14:00:55
【问题描述】:
我正在用python编写屏幕抓取应用程序,使用transitions来处理状态机。
初始状态是寻找一个 GUI 窗口。找到窗口后,状态机更改为下一个状态。
请考虑以下代码:
class ScreenScrapper(object):
window = None
def is_window_found(self):
return bool(self.window)
def state_look_for_window(self):
window = get_window() # Returns a bitmap object or None if window is not found
self.do_work()
def state_do_work(self):
print('Do some work!')
print('Window er: ', self.window)
states = ['dummy', 'state_look_for_window', 'state_do_work']
transitions = [
{'trigger': 'start', 'source': 'dummy', 'dest': 'state_look_for_window', 'after': 'state_look_for_window'},
{'trigger': 'do_work', 'source': 'state_look_for_window', 'dest': 'state_do_work', 'conditions': 'is_window_found', 'after': 'state_do_work'},
]
screen_scrapper = ScreenScrapper()
Machine(model=screen_scrapper, states=states, transitions=transitions, initial='dummy')
screen_scrapper.start()
在这个简单的示例中,start 将状态从 dummy 更改为 state_look_for_window。 after 回调将查找窗口,然后将状态更改为 state_do_work。这个转换的条件是is_window_found
问题:只要转移条件is_window_found返回False,如何再次执行state_look_for_window?请注意:我只对可以包含在状态机中的解决方案感兴趣。也就是说,外面的唯一代码必须是screen_scrapper.start()。
【问题讨论】:
-
不应该
while not is_window_found工作吗? -
我已经考虑过那个解决方案,它会奏效。但是过渡库非常积极地使用条件,所以我怀疑一定有更好更正确的方法来做到这一点,尤其是因为这种用例非常普遍。
标签: python transition fsm