kivy(v1.8) Clock.unschedule() -> AttributeError: no attribute "is_done"

kivy(v1.8) Clock.unschedule() -> AttributeError: no attribute "is_done"

溢出社区,

我现在正为以下问题而苦恼: 我想并行处理各种回调事件 运行(另外传递了自己的参数量,因此使用 "partial" 之类的东西也会起作用),我希望有按钮可以单独取消它们.我尝试以各种方式开始一个事件。使用 lambda 表示法、全局变量或寻址“Clock._events[''”。另外,我增强了在网上找到的一个示例,该示例使用新的 class 甚至将更多变量传递给回调函数。一个代码片段,它会产生与我在所有方法中得到的相同的错误,如下所示:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.lang import Builder


class CallbackHelper:
    def __init__(self, *args):
        self.app = args[0][0]
        self.instance = args[0][1]
        print 'writing from init'
        print self.app
        print self.instance

    def __call__(self, *args):
        MyWidget.my_callback(self.app, self.instance)
        print Clock._events



Builder.load_string("""
#:import Clock kivy.clock.Clock

<MyWidget>:
    Button:
        text: "Print events"
        on_press: print(Clock._events)
    Button:
        text: "Add event"
        on_press: root.start_callback(self)
    Button:
        text: "Unschedule event"
        on_press: root.start_unschedule(self) 
""")

class MyWidget(BoxLayout):
    callback_var = []
    def my_callback(self, *args):
        print("my_callback")

    def start_callback(self, instance):
        self.callback_var = Clock.schedule_interval(CallbackHelper([self, instance]), 1)

    def start_unschedule(self,instance):
        Clock.unschedule(self.callback_var)

class MyApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()

产生的错误是:

my_callback
{'default': [<ClockEvent callback=<__main__.CallbackHelper instance at 0x000000000642D248>>], '_purge_by_timeout': [<ClockEvent callback=<function _purge_by_timeout at 0x0000000004B18668>>]}
[INFO              ] [Base        ] Leaving application in progress...
 Traceback (most recent call last):
   File "[...]/test/functionScheduleCheck.py", line 53, in <module>
     MyApp().run()
   File "[...]\Anaconda2\lib\site-packages\kivy\app.py", line 792, in run
     runTouchApp()
   File "[...]\Anaconda2\lib\site-packages\kivy\base.py", line 481, in runTouchApp
     EventLoop.window.mainloop()
   File "[...]\Anaconda2\lib\site-packages\kivy\core\window\window_pygame.py", line 381, in mainloop
     self._mainloop()
   File "[...]\Anaconda2\lib\site-packages\kivy\core\window\window_pygame.py", line 287, in _mainloop
     EventLoop.idle()
   File "[...]\Anaconda2\lib\site-packages\kivy\base.py", line 324, in idle
     self.dispatch_input()
   File "[...]\Anaconda2\lib\site-packages\kivy\base.py", line 309, in dispatch_input
     post_dispatch_input(*pop(0))
   File "[...]\Anaconda2\lib\site-packages\kivy\base.py", line 220, in post_dispatch_input
     listener.dispatch('on_motion', etype, me)
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4537)
   File "[...]\Anaconda2\lib\site-packages\kivy\core\window\__init__.py", line 645, in on_motion
     self.dispatch('on_touch_down', me)
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4537)
   File "[...]\Anaconda2\lib\site-packages\kivy\core\window\__init__.py", line 657, in on_touch_down
     if w.dispatch('on_touch_down', touch):
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4537)
   File "[...]\Anaconda2\lib\site-packages\kivy\uix\widget.py", line 284, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4537)
   File "[...]\Anaconda2\lib\site-packages\kivy\uix\behaviors.py", line 93, in on_touch_down
     self.dispatch('on_press')
   File "_event.pyx", line 312, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4491)
   File "[...]\Anaconda2\lib\site-packages\kivy\lang.py", line 1299, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "<string>", line 14, in <module>
   File "[...]/test/functionScheduleCheck.py", line 46, in start_unschedule
     Clock.unschedule(self.callback_var)
   File "[...]\Anaconda2\lib\site-packages\kivy\clock.py", line 505, in unschedule
     if callback.is_done:
 AttributeError: 'ClockEvent' object has no attribute 'is_done'

例如将事件存储为全局变量 EVENT,然后调用 EVENT.cancel() 什么都不做。

有什么想法吗?

非常感谢你的帮助, 田野志美

我尝试了以下方法:

  • 在新的 virtualenv 中升级到 kivy 1.10(从 1.8)
  • 迁移代码
  • 修复:Clock._events['my_event_name'] 到 Clock.get_events()[my_event_list_nbr]

现在就像一个魅力。一种猜测是:关于 cancel() 和 unschedule 例程,回调例程在 kivy v1.8 中并未在功能上实现。感谢 kivy time 使用较新的环境安装修复此问题。