如何从.kv文件修改Python变量的值?Kivy新手技术求助
解决Kivy按钮点击修改变量并触发输出的问题
你的代码有几个关键问题导致预期效果没实现,我给你拆解并修正:
问题分析
- 全局变量无法在kv中直接访问:你定义的
experience是全局变量,kv文件的作用域绑定的是对应的experienceScreen实例,直接写experience=1只会在kv的局部作用域创建新变量,根本改不到py里的全局变量。 - 判断代码只执行一次:你写的
if experience == ...是在workoutApp().run()启动前执行的(run方法是阻塞的,程序启动时先跑完这些判断,之后点击按钮不会再触发),所以即使变量改了也不会打印。 - 错误的赋值与未调用的函数:
beginnerpressed里用了==(比较运算符)而不是=(赋值运算符),而且这个函数从来没被按钮绑定调用。
修正后的代码
Python文件
from kivy.app import App from kivy.uix.widget import Widget from kivy.properties import NumericProperty class experienceScreen(Widget): # 用Kivy的NumericProperty定义可监听的实例变量 experience = NumericProperty(0) def on_experience(self, instance, value): # 监听experience的变化,值改变时自动触发该方法 if value in (1,2,3): print("test code works.") class workoutApp(App): def build(self): return experienceScreen() if __name__ == "__main__": workoutApp().run()
Kivy文件
#: kivy 2.1.0 <experienceScreen>: FloatLayout: pos:0,0 size: root.width, root.height Label: text: "What level of gym go-er are you?" pos_hint: {'x':.4,'y':.85} size_hint:0.2,0.1 Button: text: "Beginner" pos_hint: {'x':.25,'y':.6} size_hint:0.5,0.1 on_press: root.experience = 1 Button: text: "Intermediate" pos_hint: {'x':.25,'y':.4} size_hint:0.5,0.1 on_press: root.experience = 2 Button: text: "Advanced" pos_hint: {'x':.25,'y':.2} size_hint:0.5,0.1 on_press: root.experience = 3
关键修改说明
- 用Kivy属性替代全局变量:把
experience定义为experienceScreen的NumericProperty,这样它能被Kivy的绑定系统识别,kv文件可以通过root.experience访问,而且属性变化时能自动触发回调方法。 - 监听属性变化实现打印:
on_experience是Kivy的自动回调方法,只要experience的值改变就会触发,点击按钮修改值后就能立即打印内容。 - kv中正确引用实例属性:按钮的
on_press改成root.experience = 1,直接修改Widget实例的属性,而不是创建局部变量。
内容的提问来源于stack exchange,提问作者Monty
相关产品推荐
相关产品推荐

