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

Posted

技术标签:

【中文标题】Kivy:错误弱引用对象(在时钟函数中)不再存在【英文标题】:Kivy : Error weakly-referenced object (in a clock function) no longer exists 【发布时间】:2020-08-22 18:35:50 【问题描述】:

这是我的错误代码 我认为这个错误有什么难的地方,我在论坛上找过,但找不到。

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

我尝试了什么:

制作“强引用”,这样 gc 就不会删除它:
    id: id.__self__

在我的 kv 文件中

使用“强引用”:
     self.refs = [
                self.id.__self__,
                self.id.__self__]

-使用ErrorHandler来处理错误,但错误总是会出现

我认为是什么导致了错误,但我不知道如何解决它:

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

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

此信息在kivy clock documentation:

重要

回调是弱引用的:你负责保持一个 引用您的原始对象/回调。如果你不保留一个 参考,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

感谢阅读!

【问题讨论】:

【参考方案1】:

官方文档 (Kv language Programming Guide) 说要在 KV 代码中添加“强”引用,例如 id_name: id_name.__self__,但不清楚这在哪里是必要的。更重要的是,它并没有为我解决 ReferenceError: weakly-referenced object no longer exists 错误。

所做的工作是通过将其添加到 buildozer.spec 文件的 requirements 行来强制 Buildozer 使用特定版本的 hostpython3

python3==3.7.5, hostpython3==3.7.5

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

归功于the beautiful answer from leo10011。

2020-05-19 更新:Kivy 2.0 中的此错误 reportedly has been fixed。

【讨论】:

谢谢。为了完成这项工作,我不得不删除我的 .buildozer 目录,以便重建应用程序。【参考方案2】:

我通常会做些什么来保留参考,例如my_object 是在我的kv 部分root 规则中添加my_object: my_object.__self__ 行。

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

【讨论】:

嗨,我按照你说的做了,但不是在我的根对象中(在屏幕上),这有关系吗?我无法真正显示我的代码,很抱歉 @Biloba 这可能很重要,但我不知道.. 你可以尝试发布minimal reproducible example..

以上是关于Kivy:错误弱引用对象(在时钟函数中)不再存在的主要内容,如果未能解决你的问题,请参考以下文章

Kivy Apk Buildozer:ReferenceError:弱引用对象不再存在

“弱引用对象不再存在”是啥意思?

弱引用

WeakReference(弱引用)

4中引用(强,软,弱,虚)侧重弱引用

从python中的弱引用代理获取常规引用