如何在Kivy中设置动态TextInput的ID

时间:2018-07-16 20:34:20

标签: python python-3.x kivy

一个很简单的问题,我可能就是不懂生活,

self.ids.UpdateCustomer1.add_widget(TextInput(text='123',id=str('AddUserTextBox')))

这是我的代码,我只想设置按下按钮时弹出的动态文本框的ID。一切正常,但是每当我引用AddUserTextBox.text时,它就会告诉我它不存在。或更具体的是“ NameError:名称'AddUserTextBox'未定义”

现在我已经尝试将id ='AddUserTextBox'设置为id = AddUserTextBox,但我没有运气。所有帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

问题

您无法使用self.ids.AddUserTextBox.textself.ids['AddUserTextBox'].text进行引用,因为在Python代码中创建的id与kv文件中定义的id不同。区别如下:

  1. Python代码:分配给id的值是一个字符串,并且不存储在self.ids字典中。
  2. kv文件:分配给id的值是一个字符串,并存储在self.ids字典中。

Kv language » Referencing Widgets

  

警告

     

为ID分配值时,请记住该值不是字符串。   没有引号:好-> id:值,差-> id:“值”

Kv language » Accessing Widgets defined inside Kv lang in your python code

  

当解析您的kv文件时,kivy会收集所有标有的小部件   id,并将其放在此self.ids字典类型属性中。

解决方案

有关详细信息,请参见代码段,示例和输出。

  1. 实例化 TextInput 小部件并将其分配给self.AddUserTextBox
  2. self.AddUserTextBox小部件添加到self.ids.UpdateCustomer1
  3. 通过self.AddUserTextBox.textroot.AddUserTextBox.text引用 TextInput的文本。取决于创建它的位置。

摘要

self.AddUserTextBox = TextInput(text='123')
self.ids.UpdateCustomer1.add_widget(self.AddUserTextBox)
...
print(self.AddUserTextBox.text)

示例

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput


class RootWidget(BoxLayout):

    def add_user_text(self):
        self.AddUserTextBox = TextInput(text='123')
        self.ids.UpdateCustomer1.add_widget(self.AddUserTextBox)
        print(self.AddUserTextBox.text)


class TestApp(App):

    def build(self):
        return RootWidget()


if __name__ == "__main__":
    TestApp().run()

test.kv

#:kivy 1.11.0

<RootWidget>:
    orientation: 'vertical'
    Button:
        size_hint: 1, 0.2
        text: 'Add User TextInput'
        on_release:
            root.add_user_text()

    GridLayout:
        id: UpdateCustomer1
        rows: 1

输出

Img01 Img02

答案 1 :(得分:0)

ids文件(或字符串)在第一次处理时即已设置,之后不再更新。因此,新的.kv小部件ID不会添加到TextInput中。您可以通过以下方法解决此问题:

ids

之所以使用import weakref textinput = TextInput(text='123') self.ids.UpdateCustomer1.add_widget(textinput) self.ids['AddUserTextBox'] = weakref.ref(textinput) 是因为kivy最初设置weakref字典时会使用它。这不是最好的方法。最好保留对您添加的ids的引用。