Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Kivy时钟计划外问题_Python_Kivy - Fatal编程技术网

Python Kivy时钟计划外问题

Python Kivy时钟计划外问题,python,kivy,Python,Kivy,我目前正努力充分利用kivy的时钟计划外操作。我正在为按键时的回调分配一个时间表。我已经实现了执行预定回调,但是我还希望做的是,一旦按下一个键,它不仅会启动回调,还将取消任何现有的回调。我的问题是,尽管我编写了一个event.cancel(),但该事件根本没有被取消。整个程序有点大,但我可以显示直接使用时钟的代码 def _on_keyboard_down(self, keyboard, keycode, text, modifiers): event0 = Clock.create_t

我目前正努力充分利用kivy的时钟计划外操作。我正在为按键时的回调分配一个时间表。我已经实现了执行预定回调,但是我还希望做的是,一旦按下一个键,它不仅会启动回调,还将取消任何现有的回调。我的问题是,尽管我编写了一个event.cancel(),但该事件根本没有被取消。整个程序有点大,但我可以显示直接使用时钟的代码

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()

您每次都在创建新的事件,因此您不是在取消旧的事件

可能的修复方法是只创建一次触发器:

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()

成功了!为什么触发器需要在构造函数中?虽然它们最初是在键盘上的**下创建的,但在事件()激活它之前不会调用它们。因为您需要取消相同的事件,而不是每次调用**键盘上的**下**方法时创建的新事件