Kivy: ошибка объекта со слабой ссылкой (в функции часов) больше не существует - PullRequest
1 голос
/ 07 мая 2020

Вот мой код ошибки. Я думаю, что в этой ошибке что-то не так, я просмотрел форумы, но не смог найти.

И ... у меня ошибка на моем телефоне kivy launcher python 3 и когда я собираю с buildozer) но не на моем компьютере (ubuntu 18.0.4 и windows 10) Ошибка, из чего я понимаю, исходит от сборщика мусора, который удаляет ссылку, и код пытается получить доступ к ссылке после сборщика мусора. но я не уверен, правильно ли я понимаю, что такое сборщик мусора.

Что я пробовал:

  • сделать «сильные ссылки», поэтому g c не удалите его с помощью:
    id: id.__self__

в моем файле kv

  • сделайте «сильные ссылки» с помощью:
     self.refs = [
                self.id.__self__,
                self.id.__self__]

-Использовать ErrorHandler для обработки ошибки, но ошибка продолжается вечно

То, что я думаю, вызывает ошибку, но я не знаю, как ее исправить:

  • часы, которые я использую для отправки запроса на сервер, но я не знаю почему (self.requestClient - это функция для отправки запроса):

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

  • эта информация в документации kivy clock :

Важно

Обратный вызов имеет слабую ссылку: вы несете ответственность за сохранение ссылки на исходный объект / обратный вызов. Если вы не сохраните ссылку, 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

Спасибо за чтение!

Ответы [ 2 ]

4 голосов
/ 13 мая 2020

В официальной документации ( Руководство по программированию на языке KV ) говорится о добавлении «сильных» ссылок, таких как id_name: id_name.__self__, в код KV, но неясно, где это необходимо. Более того, это не помогло мне решить ошибки ReferenceError: weakly-referenced object no longer exists.

То, что сделало , заставило Buildozer использовать конкретную c версию hostpython3, добавив это в requirements строка файла buildozer.spe c:

python3==3.7.5, hostpython3==3.7.5

Еще одно примечание: после добавления вышеуказанного к requirements я вернулся и удалил все мои ссылки __self__, и он все еще работали нормально, так что очевидно, что они больше не нужны на языке Kivy KV.

За это следует прекрасный ответ от leo10011 .

Обновление 2020- 05-19 : эта ошибка , как сообщается, исправлена ​​ в Kivy 2.0.

0 голосов
/ 07 мая 2020

То, что я обычно делаю, чтобы сохранить ссылку, например, на my_object, - это добавить строку my_object: my_object.__self__ в часть kv моего правила root.

Поскольку вы не предоставили никакого кода , Точнее не могу c ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...