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

Kivy报错:'MyApp'对象无'ids'属性,求原因及解决方法

AttributeError: 'MyApp' object has no attribute 'ids' 问题解决

报错原因

Kivy的App类本身不具备ids属性,ids是属于由Builder创建的根Widget实例的。你代码中直接用self.ids.bl访问,自然会触发属性不存在的错误。

修复方案

核心修改点

  • 保存根Widget引用:在build方法中把返回的根控件存为App实例的属性,后续通过这个属性访问其ids。
  • 修正语法错误:on_start方法定义缺少冒号,这是基础语法问题。
  • 补充缺失导入:代码用到requests、BeautifulSoup和Label但未导入,必须添加对应语句。
  • 优化ScrollView配置:ScrollView设置size_hint=(1, None)后需指定高度,同时Label要设置自适应高度才能支持滚动。

修复后的完整代码

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.scrollview import ScrollView
from kivy.uix.button import Button
from kivy.uix.label import Label  # 补充Label导入
import requests  # 补充网络请求库导入
from bs4 import BeautifulSoup  # 补充解析库导入

KV = """
BoxLayout:
    id: bl
    orientation: "vertical"
    padding: [5] 
    spacing: 10
"""

class MyButton(Button):
    color=(0, 0, 0, 1)
    valign='bottom'
    padding_y=10
    background_color=(.93, .91, .67, 1)
    background_normal='' 
 
class MyApp(App):
  
    def build(self):
        # 将根控件保存为实例属性
        self.root_widget = Builder.load_string(KV)
        return self.root_widget

    def on_start(self):  # 补充方法定义的冒号
        # 通过根控件实例访问ids
        self.root_widget.ids.bl.add_widget(MyButton(text='И. С. Тургенев. «Отцы и дети»', on_press=self.btn_press))

    def btn_press(self,instance):
        bl = self.root_widget.ids.bl
        bl.clear_widgets()
        # 给ScrollView指定高度
        sc = ScrollView(size_hint=(1, None), height=self.root_widget.height)
        x = 1
        data = ''
        while True:
            if x == 1:
                url = "http://loveread.ec/read_book.php?id=12021&p=1"
            elif x < 57:
                url = f"http://loveread.ec/read_book.php?id=12021&p={x}"
            else:
                break
            request = requests.get(url)
            soup = BeautifulSoup(request.text, "html.parser")
            teme = soup.find_all("p", class_="MsoNormal")
            for temes in teme:
                data += temes.text + "\n"  # 添加换行让文本排版更清晰
            x += 1
        # 设置Label自适应高度,支持ScrollView滚动
        book_label = Label(text=data, size_hint_y=None, height=float('inf'), text_size=(sc.width, None))
        sc.add_widget(book_label)
        bl.add_widget(sc)

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

额外提示

网络请求操作会阻塞UI线程,导致界面卡顿,后续可以尝试将爬取逻辑放到子线程中实现,提升用户体验。

内容的提问来源于stack exchange,提问作者NewbieTM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:35:19