在kivy / python中刷新AsyncImage

时间:2017-12-01 04:33:14

标签: python kivy

在python2.7 + kivy1.9中,我使用AsyncImage,如:

class Foo(BoxLayout):

..def bar(self):

....file_name=StringProperty()

..

..

....self.file_name="/../../image.png"

..

和kivy,

BoxLayout:

..AsyncImage:

....source: root.file_name

在第二次调用功能栏之前,我改变了image.png的内容。 但显示的图像不会改变。 我在kivy的源命令之后尝试了“nocache:True”,但它不起作用。

每次调用func bar时,如何才能获得正确的显示。

1 个答案:

答案 0 :(得分:0)

问题是您在每个file_name调用中声明了bar属性。 file_name属性必须是类属性:

<强> main.py

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import StringProperty


class RootWidget(BoxLayout):
    image_path = StringProperty('image1.png')  # <<<<<<<<

    def __init__(self, **kwargs):
        super(RootWidget, self).__init__(**kwargs)

    def change_image(self, path):
        self.image_path = path

class TestApp(App):
    def build(self):
        return RootWidget()


if __name__ == '__main__':
    TestApp().run()

<强> test.kv:

<RootWidget>:
    orientation: "vertical"

    AsyncImage:
        id: image
        source: root.image_path

    BoxLayout:  
        size_hint_y: 0.1

        Button:
            text: 'Image 1'
            on_press: root.change_image("image1.png")

        Button:
            text: 'Image 2'
            on_press: root.change_image("image2.png")

修改

如果您只想使用一个文件名并更改图片内容,则需要调用reload方法(nocache属性True):

<强> main.py:

import os
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import  ObjectProperty


class AsyncTest(BoxLayout):
    img = ObjectProperty()

    def show_icon(self):
        self.img.source = "/sdcard/archive/icon_0.png"

    def switch(self):
        os.system("mv /sdcard/archive/icon_1.png /sdcard/archive/icon_0.png")
        self.img.reload()

class TestApp(App):
    def build(self):
        return AsyncTest()


if __name__ == '__main__':
    TestApp().run()

<强>test.ḱv:

<AsyncTest>:
    orientation: "vertical"
    img: asyn_image

    AsyncImage:
        id: asyn_image
        nocache: True

    BoxLayout:

        size_hint_y: 0.1
        Button:
            text: 'Show'
            on_press: root.show_icon()

        Button:
            text: 'Switch'
            on_press: root.switch()

<强>输出

enter image description here