Kivy:第二次加载 AsyncImage 引发 ReferenceError
Kivy: Loading AsyncImage second time raises ReferenceError
我正在使用存储图像 URL(和其他项目)的实时数据库 (Firebase),我的应用程序从数据库中获取数据并将其显示在某些小部件。不能 post 所有代码都在这里,因为它很长。
我的 AsyncImage class 是这样的:
...
class MyAsyncImage(AsyncImage):
def __int__(self, **kwargs):
super(MyAsyncImage, self).__init__(**kwargs)
Clock.schedule_interval(self.set_image_source, 1/30)
def set_image_source(self, dt):
self.source = itemArray[3] #The image url is stored in this array
...
然后在我的 .kv 文件中我有:
<ViewContent@RelativeLayout>:
...
GridLayout:
spacing: 10
cols: 2
size_hint_y: None
height: 100
MyAsyncImage:
size: self.texture_size
pos: self.pos
代码只工作一次,我可以搜索一个项目,然后在我的小部件上显示它的内容(包括图像)。当我返回并搜索不同的项目时,更新的内容确实会正常显示在小部件上......但是加载图像会引发 ReferenceError(弱引用对象不再存在)
对我来说没有意义的是,我有一个类似的代码来更新标签的文本,无论我搜索多少次不同的项目,它都工作得很好,这是代码:
class FirstLabel(Label):
def __init__(self, **kwargs):
super(FirstLabel, self).__init__(**kwargs)
self.size_hint = (.7, None)
self.height = 60
self.markup = True
Clock.schedule_interval(self.set_text, 1/30)
def set_text(self, dt):
if itemArray[0] != "":
self.text = itemArray[0] #this works
我试过使用 id.__self__
方法进行强引用,但它不起作用。此外,定义一个 returns 源的访问器方法,然后在 .kv 文件中设置 source: self.get_image_source()
,工作......但只有一次。然后我得到 ReferenceError。即使添加然后删除 AsyncImage 小部件也会产生相同的结果......相同的错误。这让我很头疼。
任何形式的帮助都将不胜感激,我一直在寻找解决方案已经有一段时间了...没有运气。如果错误仍然存在,我将无法继续我的项目。请帮忙。
非常感谢。
这是由于使用 Python >= 3.8 时 Kivy 中的错误引起的。
已在代码库中修复。
有几种修复方法:
- 将 Kivy 更新到 2.0.0rc3 或更高版本
- 将您正在使用的 Python 降级到版本 < 3.8
- 手动编辑kivy代码(这里是具体改动:https://github.com/kivy/kivy/pull/6595/files)
我正在使用存储图像 URL(和其他项目)的实时数据库 (Firebase),我的应用程序从数据库中获取数据并将其显示在某些小部件。不能 post 所有代码都在这里,因为它很长。
我的 AsyncImage class 是这样的:
...
class MyAsyncImage(AsyncImage):
def __int__(self, **kwargs):
super(MyAsyncImage, self).__init__(**kwargs)
Clock.schedule_interval(self.set_image_source, 1/30)
def set_image_source(self, dt):
self.source = itemArray[3] #The image url is stored in this array
...
然后在我的 .kv 文件中我有:
<ViewContent@RelativeLayout>:
...
GridLayout:
spacing: 10
cols: 2
size_hint_y: None
height: 100
MyAsyncImage:
size: self.texture_size
pos: self.pos
代码只工作一次,我可以搜索一个项目,然后在我的小部件上显示它的内容(包括图像)。当我返回并搜索不同的项目时,更新的内容确实会正常显示在小部件上......但是加载图像会引发 ReferenceError(弱引用对象不再存在)
对我来说没有意义的是,我有一个类似的代码来更新标签的文本,无论我搜索多少次不同的项目,它都工作得很好,这是代码:
class FirstLabel(Label):
def __init__(self, **kwargs):
super(FirstLabel, self).__init__(**kwargs)
self.size_hint = (.7, None)
self.height = 60
self.markup = True
Clock.schedule_interval(self.set_text, 1/30)
def set_text(self, dt):
if itemArray[0] != "":
self.text = itemArray[0] #this works
我试过使用 id.__self__
方法进行强引用,但它不起作用。此外,定义一个 returns 源的访问器方法,然后在 .kv 文件中设置 source: self.get_image_source()
,工作......但只有一次。然后我得到 ReferenceError。即使添加然后删除 AsyncImage 小部件也会产生相同的结果......相同的错误。这让我很头疼。
任何形式的帮助都将不胜感激,我一直在寻找解决方案已经有一段时间了...没有运气。如果错误仍然存在,我将无法继续我的项目。请帮忙。
非常感谢。
这是由于使用 Python >= 3.8 时 Kivy 中的错误引起的。
已在代码库中修复。
有几种修复方法:
- 将 Kivy 更新到 2.0.0rc3 或更高版本
- 将您正在使用的 Python 降级到版本 < 3.8
- 手动编辑kivy代码(这里是具体改动:https://github.com/kivy/kivy/pull/6595/files)