Python Kivy如何根据整数变量控制仪表盘指针图片的旋转
解决方案
要不要切换到PyGame?
完全不需要切换工具。你当前的需求Kivy完全可以轻松实现,现在遇到的只是KV语言和Python变量的绑定问题,切换到PyGame反而需要你手动处理图层叠加、渲染刷新、事件循环适配等额外工作,开发成本更高,完全没必要。
你当前代码的问题点
- 全局定义的
OilTemp变量无法直接在KV语言中访问,KV默认作用域找不到这个变量 - 画布变换
PushMatrix之后没有对应的PopMatrix操作,会导致变换效果溢出影响其他组件 - 代码中
float = OilTemp = 180的写法覆盖了Python内置的float类型,属于无用且错误的写法
修改后的可运行代码
from kivy.app import App from kivy.lang import Builder from kivy.properties import NumericProperty from kivy.uix.floatlayout import FloatLayout class RotationApp(App): # 定义成Kivy属性,才能和KV自动绑定,值变化时自动更新UI oil_temp = NumericProperty(180) def build(self): # 可取消下方注释测试动态更新效果:运行2秒后指针自动转到90度位置 # from kivy.clock import Clock # Clock.schedule_once(lambda dt: setattr(self, 'oil_temp', 90), 2) return Builder.load_string(kv) kv = ''' FloatLayout: RelativeLayout: Image: source: 'OilTempV3.png' size_hint: (1, 0.5) pos_hint: {'x': 0, 'y': 0} Image: source: 'NeedleV1.png' size_hint: (1, 0.48) pos_hint: {'x': 0, 'y': 0} canvas.before: PushMatrix Rotate: # 直接访问App实例的oil_temp属性 angle: app.oil_temp origin: self.center canvas.after: PopMatrix ''' if __name__ == '__main__': RotationApp().run()
后续适配说明
你只需要在获取到Arduino上传的油温数值时,直接修改app.oil_temp的值,Kivy会自动同步更新指针的旋转角度,不需要手动调用刷新方法。
内容的提问来源于stack exchange,提问作者Mooffy
相关产品推荐
相关产品推荐

