KivyMD读取多用户文本输入 解决ScreenManager无text属性报错
KivyMD三角形坐标输入问题修复方案
核心错误原因
- 存在两套独立的ScreenManager实例:类外手动创建了
sm对象并添加Entry屏幕,但Builder.load_string执行时会自动生成一套绑定了所有输入组件的ScreenManager+Entry组件树,show回调里取的是类外从未渲染、没有绑定任何输入框的sm实例,自然找不到对应属性触发报错。 - MDTextField输入内容属性名写错:组件存储用户输入的属性是
text,不是代码里写的txt,属性名不存在会触发TypeError。 - 组件层级混乱:Submit按钮被添加到额外新建的空白Screen上,和实际承载输入框的ScreenManager平级,跨层级取组件很容易出现引用错误。
修复要点
- 删除类外冗余的手动创建ScreenManager、添加Entry屏幕的代码,全程使用Builder加载生成的组件树,避免多实例冲突。
- 把Submit按钮直接写到kv语言的Entry屏幕规则内,统一组件层级。
- 回调中获取输入框时,从App实际运行的组件树里取Entry屏幕实例,把所有取属性的
.txt改为.text。 - 可按需增加输入合法性校验,避免用户输入非数字内容导致后续几何计算崩溃。
修复后完整可运行代码
from kivy.lang import Builder from kivymd.app import MDApp from kivy.uix.screenmanager import Screen, ScreenManager from kivymd.uix.button import MDRoundFlatButton # 直接把Submit按钮写入kv规则,统一组件层级 helper_string = """ ScreenManager: Entry: <Entry>: name:"input" MDLabel: text:"X1" halign:"left" pos_hint:{'center_y': 0.95} MDTextField: id: x1 hint_text:"Enter X1" helper_text: "abscissa" helper_text_mode:"on_focus" pos_hint:{'center_x':0.17, 'center_y':0.95} size_hint:(0.1,0.1) width:5 MDLabel: text:"Y1" halign:"center" pos_hint:{'center_x': 0.40, 'center_y': 0.95} MDTextField: id: y1 hint_text:"Enter Y1" helper_text: "ordinate" helper_text_mode:"on_focus" pos_hint:{'center_x':0.55, 'center_y':0.95} size_hint:(0.1,0.1) width:5 MDLabel: text:"X2" halign:"left" pos_hint:{'center_y': 0.85} MDTextField: id: x2 hint_text:"Enter X2" helper_text: "abscissa" helper_text_mode:"on_focus" pos_hint:{'center_x':0.17, 'center_y':0.85} size_hint:(0.1,0.1) width:5 MDLabel: text:"Y2" halign:"center" pos_hint:{'center_x': 0.40, 'center_y': 0.85} MDTextField: id: y2 hint_text:"Enter Y2" helper_text: "ordinate" helper_text_mode:"on_focus" pos_hint:{'center_x':0.55, 'center_y':0.85} size_hint:(0.1,0.1) width:5 MDLabel: text:"X3" halign:"left" pos_hint:{'center_y': 0.75} MDTextField: id: x3 hint_text:"Enter X3" helper_text: "abscissa" helper_text_mode:"on_focus" pos_hint:{'center_x':0.17, 'center_y':0.75} size_hint:(0.1,0.1) width:5 MDLabel: text:"Y3" halign:"center" pos_hint:{'center_x': 0.40, 'center_y': 0.75} MDTextField: id: y3 hint_text:"Enter Y3" helper_text: "ordinate" helper_text_mode:"on_focus" pos_hint:{'center_x':0.55, 'center_y':0.75} size_hint:(0.1,0.1) width:5 MDRoundFlatButton: text:"Submit" pos_hint:{'center_x': 0.3, 'center_y': 0.60} on_release: app.show(self) """ class Entry(Screen): pass class TriangleApp(MDApp): def build(self): self.theme_cls.primary_palette = "Green" # 直接返回Builder加载的组件树,不再额外套空白Screen return Builder.load_string(helper_string) def show(self, obj): # 从当前运行的组件树取input屏幕,不使用类外创建的冗余实例 entr = self.root.get_screen('input') # 注意属性名是text不是txt xx1 = entr.ids['x1'].text yy1 = entr.ids['y1'].text xx2 = entr.ids['x2'].text yy2 = entr.ids['y2'].text xx3 = entr.ids['x3'].text yy3 = entr.ids['y3'].text # 后续可在此处加输入转浮点数、非空校验逻辑,再做形心垂心计算 print("读取到的坐标:", xx1, yy1, xx2, yy2, xx3, yy3) TriangleApp().run()
运行后在6个输入框填入坐标,点击Submit按钮即可在控制台看到打印的全部坐标值,直接把读取到的字符串转成浮点数,带入形心、垂心的计算公式即可实现后续功能。
内容的提问来源于stack exchange,提问作者utkarsh.naman
相关产品推荐
相关产品推荐

