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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 08:27:24