Kivy屏幕管理器开发:调用print_text()触发AttributeError求助
问题分析与解决方案
你遇到的AttributeError核心原因是调用对象不匹配:
在kv文件里,按钮点击时你调用了input.print_text(),但input是标准GridLayout的实例——这个内置组件根本没有你定义的print_text方法。而你写的SampleScreen类(带print_text方法)完全没被用到,相当于白写了😂。
另外还有个小细节:你代码里的print text是Python2的语法,如果你用的是Python3(现在更推荐),要改成print(text),否则也会触发语法错误。
最简单的修正方案(推荐)
把print_text方法直接放到对应的屏幕类(ScreenOne和ScreenTwo)里,然后在kv中调用屏幕实例的方法:
- 修改Python代码中的屏幕类:
class ScreenOne(Screen): def print_text(self, text): print(text) # 修正为Python3的print函数语法 class ScreenTwo(Screen): def print_text(self, text): print(text)
- 修改kv文件中按钮的
on_press事件:
对于ScreenOne的按钮:
Button: text: "Press Me!" on_press: root.print_text("Screen1:" + entry.text)
对于ScreenTwo的按钮:
Button: text: "Press Me!" on_press: root.print_text("Screen2:" + entry.text)
修改后,root对应的就是ScreenOne/ScreenTwo的实例,它们拥有你定义的print_text方法,就能正常执行打印操作了。
另一种方案:使用自定义布局类
如果你想保留SampleScreen这个自定义布局类,那需要把屏幕里的GridLayout替换成SampleScreen,并调整调用逻辑:
- 保持
SampleScreen类不变(记得修正print语法):
class SampleScreen(GridLayout): def print_text(self, text): print(text)
- 修改kv文件中
<ScreenOne>和<ScreenTwo>的根布局:
<ScreenOne>: SampleScreen: # 把GridLayout换成你的自定义类 id: input rows: 2 display: entry orientation: "vertical" spacing: 10 padding: 10 # 后续子控件保持不变...
<ScreenTwo>: SampleScreen: # 同样替换 id: input rows: 2 display: entry orientation: "vertical" spacing: 10 padding: 10 # 后续子控件保持不变...
这样input就变成了SampleScreen的实例,原来的input.print_text()调用就能正常工作了。
两种方案都能解决你的问题,第一种更贴合ScreenManager的使用习惯——把屏幕相关的逻辑放在屏幕类中;第二种适合把布局和逻辑封装在自定义组件里,看你的需求选择就行~
内容的提问来源于stack exchange,提问作者Akash Patel
相关产品推荐
相关产品推荐

