Kivy :错误弱引用对象(在时钟函数中)不再存在



这是我的错误代码 我认为这个错误有些困难,我在论坛上查看但找不到。

和。。。我的手机上有错误(使用 Kivy 启动器 Python 3 以及当我使用 Buildozer 构建时)但没有在我的计算机上(Ubuntu 18.0.4 和 Windows 10) 据我了解,该错误来自删除引用的垃圾收集器,并且代码尝试在垃圾收集器之后访问引用。但我不确定我是否理解垃圾收集器的事情

我试过什么:

  • 进行"强引用",以便 GC 不会删除它:
id: id.__self__

在我的 KV 文件中

  • 使用以下方法进行"强引用":
self.refs = [
self.id.__self__,
self.id.__self__]

- 使用错误处理程序来处理错误,但错误永远出现

我认为导致错误的原因,但我不知道如何解决它:

  • 我用来向服务器发送请求但我不知道为什么的时钟(self.requestClient 是一个发送请求的函数):

    C = Clock.schedule_interval(self.requestClient, 5)

  • KIVY时钟文档中的此信息:

重要

回调是弱引用的:你负责保持 引用您的原始对象/回调。如果您不保留 参考,时钟基永远不会执行您的回调

错误:

[ERROR  ] Exception catched by ExceptionHandler
05-07 11:27:45.694  2788  2823 I python  : Traceback (most recent call last):
05-07 11:27:45.694  2788  2823 I python  :   File path/kivy-launcher/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/launcher/kivy/core/window/window_sdl2.py", line 747, in mainloop
05-07 11:27:45.694  2788  2823 I python  :   File "/path/kivy-launcher/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/launcher/kivy/core/window/window_sdl2.py", line 479, in _mainloop
05-07 11:27:45.694  2788  2823 I python  :   File "/path/kivy-launcher/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/launcher/kivy/base.py", line 339, in idle
05-07 11:27:45.694  2788  2823 I python  :   File "/path/kivy-launcher/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/launcher/kivy/clock.py", line 591, in tick
05-07 11:27:45.694  2788  2823 I python  :   File "kivy/_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events
05-07 11:27:45.694  2788  2823 I python  :   File "kivy/_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events
05-07 11:27:45.694  2788  2823 I python  :   File "kivy/_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events
05-07 11:27:45.694  2788  2823 I python  :   File "kivy/_clock.pyx", line 154, in kivy._clock.ClockEvent.tick
05-07 11:27:45.694  2788  2823 I python  :   File "kivy/_clock.pyx", line 86, in kivy._clock.ClockEvent.get_callback
05-07 11:27:45.694  2788  2823 I python  :   File "/path/kivy-launcher/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/launcher/kivy/weakmethod.py", line 56, in is_dead
05-07 11:27:45.694  2788  2823 I python  : ReferenceError: weakly-referenced object no longer exists

感谢您的阅读!

官方文档(Kv语言编程指南)说要在KV代码中添加"强"引用,例如id_name: id_name.__self__,但不清楚哪里需要这样做。更重要的是,它并没有为我解决ReferenceError: weakly-referenced object no longer exists错误。

有效的方法是迫使 Buildozer 使用特定版本的hostpython3,方法是将其添加到 buildozer.spec 文件的requirements行:

python3==3.7.5, hostpython3==3.7.5

还有一个注意事项:将上述内容添加到requirements后,我返回并删除了所有__self__引用,它仍然可以正常工作,因此显然Kivy KV语言不再需要这些引用。

这要归功于leo10011的美丽答案。

2020-05-19 更新:据报道,此错误已在 Kivy 2.0 中修复。

我通常做什么来保持引用,例如my_object是在root规则的kv部分添加my_object: my_object.__self__行。

由于您没有提供任何代码,因此我不能更具体...

最新更新