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
相关产品推荐
相关产品推荐

