1 回答
TA贡献1811条经验 获得超5个赞
我不知道为什么这没有早点让我明白,但是我认为问题在您自己的问题文本中列出,是指toggleLeds
方法:
通过self.after函数递归调用此函数,在交互函数的末尾,我为每个按钮定义了该函数。
程序最初运行时,我假设您在toggleLeds
某个地方调用以启动LED的初始模式。这将通过self.after
方法末尾的调用来建立单个递归循环。但是,如果您每次单击按钮来更改状态时也调用相同的方法,则每次单击按钮都将建立一个新循环,并且每个新循环可能与初始循环同步,也可能不同步。
我可以想到几种方法来解决这种可能的冲突。一种是避免对进行新的调用toggleLeds
,但是那样在单击按钮和新的LED模式之间可能会有延迟。如果您不介意延迟,那可能是最好的解决方案。
如果要立即更改灯光/闪烁模式,则需要中断当前循环并以新的灯光/闪烁状态开始一个新的循环。根据New Mexico Tech生产的Tkinter参考,该after
方法为:
...返回一个整数“之后标识符”,如果您想取消回调,可以将其传递给.after_cancel()方法。
这就是您可以利用的方法。首先,请确保在调用after
方法时存储了该标识符:
self.after_id = self.after(self._FastBlinkTime, self.toggleLeds)
然后更改您的toggleLeds
方法定义以接受可选的“ interrupt”参数,after
如果该参数为,则取消现有循环True
:
def toggleLeds(self, interrupt=False):
if interrupt:
self.after_cancel(self.after_id)
# Existing code follows
最后,True在单击按钮后调用方法时传递给该参数:
# Existing button processing code here
self.toggleLeds(interrupt=True)
完成这些更改后,每次单击按钮将取消当前after周期并开始一个新的周期,从而防止一次运行多个周期,这应使LED保持同步。
添加回答
举报