Kivy 图像更新

Kivy image update

我完全不熟悉 GUI 设计,并尝试使用 python 和 kivy 创建一个非常简单的应用程序,并在按下按钮后添加一些动画。但是由于我对 kivy 完全陌生,所以我被困住了。我认为答案很简单,但经过 8 小时的反复试验和互联网谷歌搜索后,我感到绝望:-)

我创建了一个带有按钮和图像的小应用程序。我想做的是在 "button_pressed" 之后更改图像。 kivy文件中的代码:

<FirstTest>:
    my_image: my_image
    source_image: self.source_image
    Button:
        on_press: root.gamer.changeImage()
    My_Image:
        id: my_image
        source: self.parent.source_image    
<My_Image>:
    allow_stretch:True
    keep_ratio: False

和python代码(只有必要的部分):

class Player(object):

    def changeImage(self):
        FirstTest.source_image = 'new_image.png'


class My_Image(Image):
    pass  


class FirstTest(FloatLayout):
    my_image = ObjectProperty(None)
    source_image = StringProperty(None)
    source_image = 'First_Image.png'
    gamer = Player()
    def update(self, dt):
        print(self.source_image) #To see in realtime if the image source changed


class MyApp(App):
    def build(self):    
        game = FirstTest()
        Clock.schedule_interval(partial(FirstTest.update, FirstTest), 1/60)
        return game

当我启动应用程序时,我看到按钮和 "First_Image" 已加载。但是当我按下按钮时,什么都没有改变。我唯一看到的是 source_image 路径在控制台中发生了变化。 我不明白为什么没有使用新源重新加载图像。我想当我改变路径时,我会得到一个新的图像,如果我重复这样做,我会得到某种动画。但即使是单个图像也没有变化。如果我尝试更改 "my_image" 的对象属性,我会收到一条错误消息 "ObjectProperty has no attribute source"

我想念什么?请帮忙!

提前致谢!

我在您的代码中看到的最明显的问题是您将 class 对象 实例对象 混淆了。

FirstTest 是一个 class 对象,当您这样做时:

game = FirstTest()

您正在创建 FirstTest 实例 。该实例将拥有自己的属性和方法。这意味着您不想调用 FirstTest.updategame.update.

此外,FirstTest.source_image = ... 是错误的,因为您不是在 GUI 中更改 实例 对象上的图像源,而是修改 class 定义.您将需要改为修改 game.source_image。最简单的方法是在 App 对象中保存一个 game 的引用(self.game = game in build),然后用 App.get_running_app().game.

引用它