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

KivyMD报错AttributeError: 'Container'对象无'manager'属性求助

解决KivyMD中点击按钮出现AttributeError: 'Container' object has no attribute 'manager'的问题

错误根源

  1. 根容器错误:你的MyApp的build方法返回的是Container,但整个应用的根应该是WindowManager,否则ScreenManager无法管理页面切换逻辑。
  2. 布局嵌套错误:Container是独立的MDGridLayout,没有作为MainWindow(Screen子类)的子控件,所以它本身不具备manager属性,kv代码里的root.manager自然会报错。

修正后的代码

Python代码

from kivymd.app import MDApp
from kivy.uix.button import Button
from kivymd.uix.gridlayout import MDGridLayout
from kivymd.theming import ThemeManager
from kivy.core.window import Window
from kivy.config import Config
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder

Config.set('kivy', 'keyboard_mode', 'systemanddock')
Window.size = (480, 853)

class MainWindow(Screen):
    pass

class SecondWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class Container(MDGridLayout):
    def scit(self):
        try:
            znach = str(self.text_input.text)
        except:
            znach = 'ничего не введено'

class MyApp(MDApp):
    theme_cls = ThemeManager()
    title = 'Пока что так'

    def build(self):
        self.theme_cls.theme_style = 'Light'
        # 加载kv文件,让WindowManager作为应用根容器
        return Builder.load_file("your_kv_file.kv")  # 替换为你的kv文件名

if __name__ == "__main__":
    MyApp().run()

kv文件

WindowManager:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: 'main'
    # 将Container嵌套为MainWindow的子控件
    Container:
        id: container

<ItemLabel@MDLabel>:
    font_size: '35sp'
    valign:'middle'
    text_size: self.size

<Container>:
    rows: 30
    padding: [30, 20, 30, 10]
    text_input: text_input

    MDTextField:
        id: text_input
        size_hint: 4, 2.4
        multiline: True
        font_size: '45sp'
        input_type: 'text'
        hint_text: 'Введите продукты здесь'

    FloatLayout:
        MDRaisedButton:
            size_hint: 0.7, 0.6
            pos_hint: {'center_x':0.5,'y': 0.2}
            text: 'Найти блюда'
            font_size: '25sp'

            on_release:
                root.scit()
                # 通过父控件MainWindow访问ScreenManager
                app.root.current = "second" if text_input.text.strip() != "" else "main"
                root.parent.manager.transition.direction = "left"

<SecondWindow>:
    name: "second"

    Button:
        text: "Go Back"
        on_release:
            app.root.current = "main"
            root.manager.transition.direction = "right"

额外说明

  • 修正了kv文件中WindowManager子控件的缩进问题,确保MainWindow和SecondWindow被正确包含在ScreenManager中。
  • 调整了按钮切换页面的判断逻辑,从判断text_input.text != "None"改为text_input.text.strip() != "",符合输入框空值的实际情况。
  • 修复了MyApp中build方法的缩进错误,避免语法异常。

内容的提问来源于stack exchange,提问作者Альберт Гайсин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:36:11