填充内存后,未显示Kivy应用程序中未显示的图像(显示黑框)



我一直在使用kivy示例Python代码来尝试在官方的Raspberry Pi触摸屏上进行幻灯片。当我循环浏览JPG照片目录时,这些图像最终拒绝出现,仅显示黑匣子。我没有错误消息。我认为这是一个内存泄漏,尽管我不确定如何测试。以下代码(下载照片,将其复制9次并以每张照片延迟3秒显示(停止显示图像在#7处。如果我使用较大的图像,它们会停止出现。不应该清除小部件释放内存吗?

main.py

import kivy
kivy.require('1.0.6')
from kivy.clock import Clock
import urllib
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image
from kivy.uix.label import Label
from functools import partial
from kivy.core.window import Window
import shutil    
def displayphoto(i, root, *largs):
    name=str(i)+".jpg"
    root.clear_widgets()
    img = Image(source=name, nocache=False)
    root.add_widget(img)
    label = Label(text=name)
    root.add_widget(label)
class NoscatterApp(App):
    def build(self):
        root = FloatLayout()
        #os.remove("*.jpg")
        urllib.urlretrieve("https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Shed_with_green_roof_at_Lyngen_fjord%2C_2012_June.jpg/1200px-Shed_with_green_roof_at_Lyngen_fjord%2C_2012_June.jpg", "main.jpg")
        for i in range(0, 10):
            name=str(i)+".jpg"
            shutil.copy("main.jpg", name)        
            Clock.schedule_once(partial(displayphoto, i, root), i*3)    
        return root
    def on_pause(self):
        return True
if __name__ == '__main__':
    NoscatterApp().run()

有点晚,但是尝试使用AsyncImage代替Image

from kivy.uix.image import AsyncImage
img = Image(source=name, nocache=False)

如果这没有解决问题,请尝试设置nocache=True。这大大减少了我遇到黑色图像的次数,但仍未完全固定。

最后,我最终使用PIL来调整并压缩原始图像,这使我完全解决了问题。

from PIL import Image as PILImage  # Name conflict with kivy.uix.image
img = Image(nocache=False)
pil_image = PILImage.open(name)
pil_image.thumbnail((512, 512)) # Pick any size you want.
pil_image.save("temp/current_image.jpg", format='JPEG', optimize=True, quality=90)
# Lower quality = more compression
img.source = "temp/current_image.jpg"

磁盘上的原始图像保持不变,只有显示的图像被压缩。降低图像大小的任何其他技术也应起作用。

最新更新