Kivy的.kv文件运行报'super' object无'__getattr__'属性错误求解
问题原因排查
你遇到的报错由两处代码错误共同导致:
- 类继承逻辑错误:
MyLayout类同时继承了Widget和App,违背Kivy的设计规范。仅主应用入口类需要继承App,布局组件类仅需继承Widget,错误的多继承会打断ids属性的初始化绑定逻辑。 - kv文件id语法错误:kv中
BoxLayout的id加了多余的双引号,Kivy的kv语法规定id不需要加引号,带引号的id无法被正确识别并写入self.ids字典。
修正后代码
Python代码
from kivy.app import App from kivy.uix.widget import Widget from kivy.lang import Builder from kivy.uix.label import Label Builder.load_file("my.kv") # 仅继承Widget即可 class MyLayout(Widget): def clear(self): self.ids.n.text = "" self.ids.fp.text = "" self.ids.d.text = "" def writeD(self): name = self.ids.n.text pizza = self.ids.fp.text drinks = self.ids.d.text orders = open("order.txt","w") orders.write(f"Name: {name}\n") orders.write(f"Pizza: {pizza}\n") orders.write(f"Drinks: {drinks}") orders.close() def read(self): orders = open("order.txt","r") orderL = orders.read() self.ids.layout.add_widget(Label(text=orderL)) orders.close() class AwesomeApp(App): def build(self): return MyLayout() if __name__ == '__main__': AwesomeApp().run()
补充:顺便给文件操作加上了close()调用,避免资源泄漏。
my.kv代码
<Button> font_size:20 <TextInput> font_size:20 <Label> font_size:20 <MyLayout> BoxLayout: # id去掉双引号 id: layout orientation:"vertical" size: root.width,root.height padding:10 spacing:10 Label: text:"Name" TextInput: id: n multiline:False Label: text:"Pizza" TextInput: id: fp multiline:False Label: text:"Drinks" TextInput: id: d multiline:False Button: text:"Submit" on_press:root.writeD() Button: text:"Clear fields" on_press:root.clear() Button: text:"show orders" on_press:root.read()
修改后重新运行即可正常加载,所有功能均可正常触发。
内容的提问来源于stack exchange,提问作者Sricharan Athanti
相关产品推荐
相关产品推荐

