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.update
但 game.update
.
此外,FirstTest.source_image = ...
是错误的,因为您不是在 GUI 中更改 实例 对象上的图像源,而是修改 class 定义.您将需要改为修改 game.source_image
。最简单的方法是在 App 对象中保存一个 game 的引用(self.game = game
in build
),然后用 App.get_running_app().game
.
引用它
我完全不熟悉 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.update
但 game.update
.
此外,FirstTest.source_image = ...
是错误的,因为您不是在 GUI 中更改 实例 对象上的图像源,而是修改 class 定义.您将需要改为修改 game.source_image
。最简单的方法是在 App 对象中保存一个 game 的引用(self.game = game
in build
),然后用 App.get_running_app().game
.