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 使用较新的环境安装修复此问题。
溢出社区,
我现在正为以下问题而苦恼: 我想并行处理各种回调事件 运行(另外传递了自己的参数量,因此使用 "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 使用较新的环境安装修复此问题。