从类的.kv文件中定义的TextInput获取文本

时间:2019-03-08 09:13:09

标签: python kivy

我在python中有以下代码:

from kivy.app import App
from kivy.uix.widget import Widget
class UI(Widget):
    pass

class UIApp(App):
    def build(self):
        return UI()

    def process(self):
        text = self.ids.input.text
        print(text)

以及在UI.kv中:

#:kivy 1.0.9

<UI>:
    title: 'InputDialog'
    auto_dismiss: False
    id: 'test1'

    RelativeLayout:
        orientation: 'vertical'
        pos: self.pos
        size: root.size
        id: 'test2'

        TextInput:
            id: 'input'
            hint_text:'Enter compounds'
            pos_hint: {'center_x': 0.5, 'center_y': 0.705}
            size_hint: 0.95, 0.5

现在,如果我调用process(),则会收到错误'UIApp' object has no attribute 'ids'。好的。现在,我尝试将self替换为UIAttributeError: 'kivy.properties.DictProperty' object has no attribute 'input'。尝试获取'test1'也无济于事,也没有删除.kv文件中ID周围的'。

有没有一种方法可以从字段中获取输入而无需以编程方式创建此字段?

1 个答案:

答案 0 :(得分:1)

问题

在您的kv文件中,您已将id定义为字符串。

Kivy » Referencing Widgets

  

警告

     

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

解决方案

  1. 在您的kv文件中,删除所有id中的单引号
  2. 在您的Python脚本中,将self.ids.input.text替换为self.root.ids.input.text,因为ids是在根class UI()下定义的。

示例

kv文件

#:kivy 1.0.9

<UI>:
    title: 'InputDialog'
    auto_dismiss: False
    id: test1

    RelativeLayout:
        orientation: 'vertical'
        pos: self.pos
        size: root.size
        id: test2

        TextInput:
            id: input
            hint_text:'Enter compounds'
            pos_hint: {'center_x': 0.5, 'center_y': 0.705}
            size_hint: 0.95, 0.5
            on_text: app.process()

main.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder


Builder.load_file('main.kv')


class UI(Widget):
    pass


class UIApp(App):
    def build(self):
        return UI()

    def process(self):
        text = self.root.ids.input.text
        print(text)


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

输出

Accesing textinput in kv file using ids