如何获取Kivy中动态生成的TextInput组件的id?
解决Kivy中获取TextInput的id问题
我明白你遇到的问题了——在Kivy里直接访问TextInput实例的id属性会返回None,这是因为kv文件中定义的id并不是子控件自身的属性,而是作为键存储在父控件(这里是Row)的ids字典里的。下面给你两种可行的解决方案:
方法一:直接通过Row的ids访问TextInput(推荐)
既然你已经在kv文件里给每个Row内的TextInput定义了test1和test2的id,那完全可以跳过遍历子控件的步骤,直接通过Row实例的ids字典获取对应的输入框。这样代码更简洁,逻辑也更清晰:
修改display类中的insert方法:
def insert(self): rows = self.ids.rows # 反向遍历所有Row(和你原来的遍历顺序一致) for row in reversed(rows.children): # 直接从Row的ids中拿到test1输入框 test1_input = row.ids.test1 if test1_input.text.strip() == "": print("TextInput is required") test1_input.focus = True return # 找到第一个空的test1就停止,避免继续检查 # 如果所有test1都不为空,执行后续逻辑 print("All required Value1 fields are filled")
这个方法不需要遍历子控件,直接定位到你需要的test1输入框,完美满足你只校验test1空值、忽略test2的需求。
方法二:给TextInput手动设置id属性(不推荐)
如果你坚持要通过遍历子控件的方式获取id,可以在kv文件中给TextInput手动设置自身的id属性(注意和kv中的id区分开,这是控件实例的属性):
修改test.kv中的Row部分:
<Row>: orientation: "horizontal" spacing: 0, 5 Button: text: root.button_text size_hint_x: .2 TextInput: id : test1 size_hint_x: .4 id: 'test1' # 设置控件自身的id属性 TextInput: id : test2 size_hint_x: .4 id: 'test2' # 设置控件自身的id属性
这样修改后,你原来的遍历代码就能打印出test1/test2的id了,但这种方法容易和kv中的id混淆,不符合Kivy的常规用法,所以更推荐第一种方法。
另外,建议你在判断空值时加上strip(),避免用户输入空格被误判为非空。
内容的提问来源于stack exchange,提问作者Nirdesh Kumawat
相关产品推荐
相关产品推荐

