2017-02-12 37 views
0

我目前正在努力充分利用Kivy的时钟不安排操作。按下某个键时,我正在为回调分配一个时间表。我已经完成了执行计划的回调,但是我也希望做的是一旦按下了一个键,它不仅会启动回调,还会取消任何现有的回调。我的问题是,虽然我编码了一个event.cancel(),但事件并没有被取消。整个程序有点大,但我可以显示直接使用时钟的代码。Kivy时钟未修正问题

def _on_keyboard_down(self, keyboard, keycode, text, modifiers): 
    event0 = Clock.create_trigger(lambda dt: self.pressHome(), 3) 
    event1 = Clock.create_trigger(lambda dt: self.selectFig(coord = 'A2'), 2) 
    event2 = Clock.create_trigger(lambda dt: self.selectFig(coord = 'A3'), 4) 

    if keycode[1] == 'd': 
     coord = 'A3' 
     self.selectFig(coord) 
     event1() 
     event2() 
     event0.cancel() 

    elif keycode[1] == 'f': 
     coord = 'A4' 
     self.selectTxt(coord) 

     event1.cancel() 
     event2.cancel() 
     event0() 

回答

0

你正在创建每次事件,因此你取消旧的

一个可能的修复可能创建触发器只一次

def __init__(self, **kw): 
    self.event0 = Clock.create_trigger(lambda dt: self.pressHome(), 3) 
    self.event1 = Clock.create_trigger(lambda dt: self.selectFig(coord = 'A2'), 2) 
    self.event2 = Clock.create_trigger(lambda dt: self.selectFig(coord = 'A3'), 4) 

def _on_keyboard_down(self, keyboard, keycode, text, modifiers): 
    event0 = Clock.create_trigger(lambda dt: self.pressHome(), 3) 
    event1 = Clock.create_trigger(lambda dt: self.selectFig(coord = 'A2'), 2) 
    event2 = Clock.create_trigger(lambda dt: self.selectFig(coord = 'A3'), 4) 

    if keycode[1] == 'd': 
     coord = 'A3' 
     self.selectFig(coord) 
     self.event1() 
     self.event2() 
     self.event0.cancel() 

    elif keycode[1] == 'f': 
     coord = 'A4' 
     self.selectTxt(coord) 

     self.event1.cancel() 
     self.event2.cancel() 
     self.event0() 
+0

有效!为什么触发器需要在构造函数中?尽管它们最初是在_on_keyboard_down中创建的,但是它们在事件()激活之前不会被调用。 – 12edd

+0

因为您需要取消相同的事件,而不是每次调用** _on_keyboard_down **方法时创建的新事件 –