【问题标题】:How to set ID of dynamic TextInput in Kivy如何在 Kivy 中设置动态 TextInput 的 ID
【发布时间】:2018-07-16 20:34:20
【问题描述】:

很简单的问题,我可能只是不理解生活,

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

这是我的代码,我只想设置按下按钮时弹出的动态文本框的 id。一切正常,但是每当我引用 AddUserTextBox.text 时,它都会告诉我它不存在。或者更具体地说“ NameError: name 'AddUserTextBox' is not defined”

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

【问题讨论】:

    标签: python python-3.x kivy


    【解决方案1】:

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

    import weakref
    textinput = TextInput(text='123')
    self.ids.UpdateCustomer1.add_widget(textinput)
    self.ids['AddUserTextBox'] = weakref.ref(textinput)
    

    使用 weakref 是因为 kivy 在最初设置 ids 字典时使用了它。这不是最好的方法。最好保留对您添加的TextInput 的引用。

    【讨论】:

      【解决方案2】:

      问题

      您不能使用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 赋值时,请记住该值不是字符串。 没有引号:good -> id: value, bad -> id: 'value'

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

      当您的 kv 文件被解析时,kivy 会收集所有标记为的小部件 id 并将它们放在这个 self.ids 字典类型属性中。

      解决方案

      详情请参考sn-ps、示例和输出。

      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
      

      输出

      【讨论】:

      • 虽然效果很好,但仍然不允许您访问 .text 属性。除非有一些我不明白的关于 id 的东西。尽管如此,还是感谢您的帮助。
      • 引用文本使用self.AddUserTextBox.textroot.AddUserTextBox.text。取决于它的创建位置。不需要任何 ID。
      猜你喜欢
      • 2020-11-26
      • 1970-01-01
      • 2021-11-03
      • 2016-04-06
      • 2017-11-16
      • 1970-01-01
      • 2017-06-17
      • 2015-12-20
      • 2016-01-15
      相关资源
      最近更新 更多