自定义类调用MyTextField.text获取MDTextField文本返回<AliasProperty name=text>问题
问题原因及解决方案
核心问题
你得到<AliasProperty name=text>是因为直接访问了类的属性而非实例属性,同时代码里的自定义类继承存在错误。
代码中的关键错误
- 自定义类继承逻辑错误:
Class MyTextField(MyTextField):是继承自身,会引发逻辑混乱,正确应该继承MDTextField。 - 访问类属性而非实例:
MyTextField.text是访问MyTextField这个类的属性,而非界面中实际创建的输入框实例的文本内容,所以返回的是KivyMD中text属性的别名对象,不是用户输入的实际文本。
修正方案
步骤1:修正自定义文本框类
from kivymd.uix.textfield import MDTextField class MyTextField(MDTextField): pass
步骤2:获取输入框实例的文本
你需要获取界面中MyTextField的具体实例,而非直接用类名访问。常见实现方式有两种:
方式一:通过ID获取实例(适用于KV文件中给输入框设置了id的场景)
假设KV文件中给MyTextField设置了id为my_textfield,可以这样获取文本:
def create_playlist(self, txt): app = MDApp.get_running_app() # 获取输入框实例 text_field = app.root.ids.my_textfield input_text = text_field.text if input_text: self.venus.append(input_text) # 简化列表推导式 data = [{"text": item, "size_hint_x": 1} for item in self.venus] app.root.ids.rp.data = data
方式二:通过方法参数传递文本
你的create_playlist方法有txt参数但未使用,可以直接用该参数传递输入框的文本(比如在KV文件中绑定按钮点击事件时传入):
def create_playlist(self, txt): app = MDApp.get_running_app() if txt: self.venus.append(txt) data = [{"text": item, "size_hint_x": 1} for item in self.venus] app.root.ids.rp.data = data
额外优化点
- 空字符串判断直接用
if input_text:即可,比if input_text == "":更简洁。 - 列表推导式无需通过索引遍历,直接遍历
self.venus元素即可。
内容的提问来源于stack exchange,提问作者TINSEL19
相关产品推荐
相关产品推荐

