一个很简单的问题,我可能就是不懂生活,
self.ids.UpdateCustomer1.add_widget(TextInput(text='123',id=str('AddUserTextBox')))
这是我的代码,我只想设置按下按钮时弹出的动态文本框的ID。一切正常,但是每当我引用AddUserTextBox.text时,它就会告诉我它不存在。或更具体的是“ NameError:名称'AddUserTextBox'未定义”
现在我已经尝试将id ='AddUserTextBox'设置为id = AddUserTextBox,但我没有运气。所有帮助将不胜感激
答案 0 :(得分:0)
您无法使用self.ids.AddUserTextBox.text
或self.ids['AddUserTextBox'].text
进行引用,因为在Python代码中创建的id
与kv文件中定义的id
不同。区别如下:
id
的值是一个字符串,并且不存储在self.ids
字典中。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字典类型属性中。
有关详细信息,请参见代码段,示例和输出。
self.AddUserTextBox
self.AddUserTextBox
小部件添加到self.ids.UpdateCustomer1
self.AddUserTextBox.text
或root.AddUserTextBox.text
引用 TextInput的文本。取决于创建它的位置。 self.AddUserTextBox = TextInput(text='123')
self.ids.UpdateCustomer1.add_widget(self.AddUserTextBox)
...
print(self.AddUserTextBox.text)
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()
#: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
答案 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
的引用。