Python Kivy FloatLayout按钮绑定自定义方法及属性报错解决方案
Kivy 按钮绑定App类方法报错解决方案
认知校验
- 认知1:正确,你定义的
MyGeneralForm确实是继承自Kivy官方App基类的自定义应用类。 - 认知2:
build()方法不是类构造函数,它的作用是返回应用的根控件实例。你返回FloatLayout()后,Kivy会自动加载kv文件中匹配的<FloatLayout>规则渲染这个根布局,kv文件名只要符合「App类名全小写、去掉末尾App后缀」的规则(你这里应该命名为mygeneralform.kv)就能自动关联。 - 认知3:正确,两个方法的逻辑本身没有问题。
- 认知4:先实例化赋值给变量再调用
run()的写法完全可行,两种写法没有功能差异,直接写MyGeneralForm().run()是不需要复用实例时的简化写法。 - 认知5:正确,你定义的
<Button>是全局样式规则,会作用到当前应用的所有Button控件。 - 认知6:正确,你在
<FloatLayout>规则内定义的两个按钮会被自动添加到作为根布局的FloatLayout实例中。 - 认知7:报错原因是kv语法中
root关键字指代当前规则对应的控件实例,你当前的规则是<FloatLayout>,所以root指向FloatLayout对象,而你的两个方法是定义在App类中的,自然会报属性不存在的错误。
修复方案
最简单的修改方式是调整kv文件中事件绑定的调用对象:kv语法中app关键字默认指向当前运行的App实例,也就是你定义的MyGeneralForm类的实例,直接把两个按钮的on_press绑定中的root替换为app即可:
<Button>: font_size:20 color:0.3,0.6,0.7,1 size_hint: 0.4, 0.2 <FloatLayout>: Button: id: btnTestEnviron pos_hint: {"x":0.3,"y":0.75} text: "Run on test Environment" background_color: 0.3,0.4,0.5,1 on_press: app.btnTestEnviron() Button: id: btnExit pos_hint: {"x":0.3,"y":0.0} text: "Exit" background_color: 0.3,0.4,0.5,1 on_press: app.btnClose()
如果后续应用逻辑复杂度提升,需要做分层解耦,也可以自定义FloatLayout子类,把业务逻辑放到布局类中:
- 修改Python代码,新增自定义布局类:
import kivy from kivy.app import App from kivy.uix.floatlayout import FloatLayout # 新增自定义布局类 class MyFloatLayout(FloatLayout): def btnTestEnviron(self): print("Print this on console") def btnClose(self): App.get_running_app().root_window.close() class MyGeneralForm(App): def build(self): # 返回自定义布局实例 return MyFloatLayout() if __name__ == "__main__": MyGeneralForm().run()
- 对应修改kv文件的规则头为自定义布局类:
<Button>: font_size:20 color:0.3,0.6,0.7,1 size_hint: 0.4, 0.2 <MyFloatLayout>: Button: id: btnTestEnviron pos_hint: {"x":0.3,"y":0.75} text: "Run on test Environment" background_color: 0.3,0.4,0.5,1 on_press: root.btnTestEnviron() Button: id: btnExit pos_hint: {"x":0.3,"y":0.0} text: "Exit" background_color: 0.3,0.4,0.5,1 on_press: root.btnClose()
内容的提问来源于stack exchange,提问作者Hronic
相关产品推荐
相关产品推荐

