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

问题描述 投票:0回答:1

因此,这里是我的错误代码我认为有什么硬在这个错误,我在论坛上寻找,但无法找到。

而且......我有这个错误 在我的手机上 (有 kivy launcher python 3 而当我用buildozer构建) 但不是在我的电脑上 (ubuntu 18.0.4 and windows 10)这个错误,从我的理解来看,来自于垃圾收集器,它删除了一个引用,而代码试图在垃圾收集器之后访问这个引用,但我不确定我是否真正理解垃圾收集器的事情。

我试了一下:

  • 做 "强引用",这样gc就不会删除它。
    id: id.__self__

在我的kv文件中

  • 用.NET做 "强引用"。
     self.refs = [
                self.id.__self__,
                self.id.__self__]

-使用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

感谢您的阅读 !

python android garbage-collection kivy weak-references
1个回答
2
投票

官方文档 (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

还有一点需要注意的是,在将上述内容添加到 requirements我回去把我所有的 __self__ 引用,但仍然可以正常工作,所以显然在Kivy KV语言中不再需要这些。

这要归功于 来自leo10011的美丽回答.

2020-05-19更新: 这个错误 据称已经修复 在Kivy 2.0中。


0
投票

我通常会做的是保留一个引用,如 my_object 的引用,我通常会在其中添加 my_object: my_object.__self__ 一行 kv 我的一部分 root 规则。

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

© www.soinside.com 2019 - 2024. All rights reserved.