Kivy通过按钮加载kv文件切换GUI报Builder is not defined问题咨询
解决思路与修改方案
核心问题梳理
- kv文件中定义的
<oiltemp>、<airtemp>自定义组件,在Python代码中没有对应的同名类,Kivy解析kv时找不到匹配类会触发异常 - 之前的Builder未定义报错,大概率是你在kv的按钮点击事件里直接调用了Builder方法,kv的作用域没有导入Builder模块,无法识别该对象
- 缺少多界面管理的容器,Kivy官方推荐用
ScreenManager实现同窗口下的多界面切换,无需手动反复加载kv文件 - kv文件中存在非法属性:
pos_hint没有left_x、bottom_y字段,重复定义center_x也会导致布局异常
完整修改代码
1. 主Python文件
from kivy.app import App from kivy.lang import Builder from kivy.properties import NumericProperty from kivy.uix.floatlayout import FloatLayout from kivy.uix.screenmanager import ScreenManager, Screen from kivy.config import Config Config.set('graphics', 'resizable', False) Config.set('graphics', 'width', '600') Config.set('graphics', 'height', '300') # 预加载两个kv文件 Builder.load_file('oiltemp.kv') Builder.load_file('airtemp.kv') class CustomRow(FloatLayout): pass class CustomGrid(FloatLayout): pass # 定义两个界面对应的Screen类 class OilTempScreen(Screen): OilTemp = NumericProperty(0) class AirTempScreen(Screen): pass class RotationApp(App): def build(self): # 初始化界面管理器 self.sm = ScreenManager() self.sm.add_widget(OilTempScreen(name='oiltemp')) self.sm.add_widget(AirTempScreen(name='airtemp')) return self.sm # 界面切换方法,按钮直接调用这个方法即可 def switch_screen(self): if self.sm.current == 'oiltemp': self.sm.current = 'airtemp' else: self.sm.current = 'oiltemp' if __name__ == '__main__': RotationApp().run()
2. oiltemp.kv
<OilTempScreen>: CustomRow: FloatLayout: id: 0 FloatLayout: id: 1 CustomGrid: CustomRow: id: 0 CustomRow: id: 1 Image: source: 'OilTempV2.png' size: self.texture_size pos_hint: {'center_x': .5, 'center_y': .5} Image: source: 'NeedleV1.png' size: self.texture_size pos_hint: {'center_x': .5, 'center_y': .5} Button: text: 'Next Screen' size_hint: None, None size: 100, 50 pos_hint: {'x': 0, 'y': 0} on_press: app.switch_screen() canvas.before: PushMatrix Rotate: angle: 0 origin: self.center canvas.after: PopMatrix
3. airtemp.kv
<AirTempScreen>: CustomRow: FloatLayout: id: 0 FloatLayout: id: 1 CustomGrid: CustomRow: id: 0 CustomRow: id: 1 Image: source: 'AirTempV1.png' size: self.texture_size pos_hint: {'center_x': .5, 'center_y': .5} Image: source: 'NeedleV1.png' size: self.texture_size pos_hint: {'center_x': .5, 'center_y': .5} Button: text: 'Next Screen' size_hint: None, None size: 100, 50 pos_hint: {'x': 0, 'y': 0} on_press: app.switch_screen() canvas.before: PushMatrix Rotate: angle: 0 origin: self.center canvas.after: PopMatrix
功能说明
- 启动时默认加载油温界面,点击左下角的Next Screen按钮即可在两个界面之间循环切换
- 提前加载kv文件避免运行时加载的性能损耗和异常,所有切换逻辑通过ScreenManager原生实现,稳定性更高
- 修正了原kv文件中的布局属性错误,按钮尺寸、位置已做适配,你可以根据自己的需求调整size和pos_hint参数
内容的提问来源于stack exchange,提问作者Mooffy
相关产品推荐
相关产品推荐

