You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy通过按钮加载kv文件切换GUI报Builder is not defined问题咨询

解决思路与修改方案

核心问题梳理

  1. kv文件中定义的<oiltemp>、<airtemp>自定义组件,在Python代码中没有对应的同名类,Kivy解析kv时找不到匹配类会触发异常
  2. 之前的Builder未定义报错,大概率是你在kv的按钮点击事件里直接调用了Builder方法,kv的作用域没有导入Builder模块,无法识别该对象
  3. 缺少多界面管理的容器,Kivy官方推荐用ScreenManager实现同窗口下的多界面切换,无需手动反复加载kv文件
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:09:02