如何从其他类动态修改Kivy中MyButton的source属性?
Kivy动态按钮加载PNG图片修复方案
你的代码存在几个关键问题,导致图片无法正常加载,以下是修复后的完整代码及问题说明:
问题分析
- ObjectProperty使用错误:
Programme类中mybutton = ObjectProperty(MyButton)是将MyButton类本身赋值给属性,而非按钮实例,完全起不到绑定作用。 - 动态创建按钮时未设置图片源:循环中创建按钮时,你错误地使用小写类名
mybutton,且没有给当前创建的按钮实例设置source,反而去修改一个无关的类属性。 - 图片路径可能不正确:需确保
images文件夹与主脚本在同一目录,且图片文件名正确。
修复后的代码
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.metrics import dp import requests from kivy.properties import ObjectProperty from kivy.uix.behaviors import ButtonBehavior from kivy.uix.image import Image class MyButton(ButtonBehavior, Image): # 无需在__init__中强制设空source,创建实例时可直接指定或后续修改 pass class Programme(BoxLayout): # 移除错误的ObjectProperty定义,动态创建按钮不需要这个 def Over(self, s_image, screenmanager): # 假设self.Today是已定义的数据源 for i in range(len(self.Today[0])): # 替换为你的实际计算逻辑 sonuc = 2.0 # 示例值 # 根据计算结果创建对应图片的按钮 if sonuc < 2.50: btn_source = 'images/1.png' else: btn_source = 'images/2.png' box = BoxLayout(size_hint_y=None, height=dp(50)) # 创建MyButton实例并设置图片源 ust_2_5 = MyButton(size_hint=(0.15, 1), source=btn_source) box.add_widget(ust_2_5) self.ids.gridsonuc.add_widget(box) # 示例App类(如果你的代码中没有需要补充) class MyApp(App): def build(self): return Programme() if __name__ == '__main__': MyApp().run()
额外注意事项
- 图片路径验证:可以先用绝对路径测试,比如
btn_source = '/full/path/to/images/1.png',确认图片能加载后再改回相对路径。 - 按钮点击事件:如果需要给
MyButton添加点击逻辑,可在MyButton类中重写on_press或on_release方法。 - 布局ID确认:确保
Programme对应的kv文件(或动态创建的布局)中确实存在gridsonuc这个ID,否则会报错。
内容的提问来源于stack exchange,提问作者user19925544
相关产品推荐
相关产品推荐

