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

Bil*_*oba 1 python android garbage-collection weak-references kivy

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

而且...我的手机上有错误(使用kivy launcher python 3,当我使用 buildozer 构建时)但我的电脑上没有错误(ubuntu 18.0.4 和 windows 10) 据我了解,错误来自垃圾删除引用的收集器,并且代码尝试在垃圾收集器之后访问该引用。但我不确定我是否真的了解垃圾收集器

我试过的:

  • 进行“强引用”,以便 gc 不会删除它:
    id: id.__self__
Run Code Online (Sandbox Code Playgroud)

在我的 kv 文件中

  • 使用以下方法进行“强引用”:
     self.refs = [
                self.id.__self__,
                self.id.__self__]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

重要的

回调是弱引用:您负责保持对原始对象/回调的引用。如果您不保留引用,则 ClockBase 将永远不会执行您的回调

错误 :

[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
Run Code Online (Sandbox Code Playgroud)

谢谢阅读 !

bit*_*ant 9

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

什么的工作是迫使Buildozer使用特定版本hostpython3加入这个到requirements了buildozer.spec文件的行:

python3==3.7.5, hostpython3==3.7.5
Run Code Online (Sandbox Code Playgroud)

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

这要归功于 leo10011 的漂亮答案

2020 年 5 月 19 日更新据报道,此错误在 Kivy 2.0 中修复