Kivy Binding Textinput to Submit Button gives AttributeError: 'NoneType' object has no attribute 'text'

Kivy Binding Textinput to Submit Button gives AttributeError: 'NoneType' object has no attribute 'text'

我正在尝试为我的论文构建一个小应用程序,在完成基本布局后,我尝试绑定一些操作。 现在我正在努力通过按下提交按钮来保存一些 TextInputs。问题可能是我在与带有按钮 'Submit' 和 'Clear' 的 StatusBar 所在的 .kv 文件不同的 .kv 文件中创建了 TextInput Grid。 一开始我只是想在按下 'Submit' 时在我的控制台中打印 TextInput。我希望你能帮助我,我想我不应该太难,我只是因为编程经验的限制而错过了一些东西。

所以这是我的主要 python 文件:

import kivy
from kivy.app import App
from kivy.uix.button import Label
from kivy.uix.widget import Widget
from kivy.uix.textinput import TextInput
from kivy.lang import Builder
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty

Builder.load_file('Header.kv')
Builder.load_file('Statusbar.kv')
Builder.load_file('Inputparameters.kv')
Builder.load_file('Outputparameters.kv')

class Peenomat(AnchorLayout):
    pass

class PeenomatApp(App):
    def build(self):
        return Peenomat()

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

我的主要 Kivy 文件

<Peenomat>

    AnchorLayout:
        anchor_x: 'left'
        anchor_y: 'bottom'
        GridLayout:
            cols: 1

            canvas.before:
                Color:
                    rgba: 0.75 ,0.75, 0.75, 1
                Rectangle:
                    pos: self.pos
                    size: self.size

            Header:
                id: _header
                size_hint: 1, 0.1
                #height: 100

            InputParameters:
                id:_input_parameters
                size_hint: 1, 0.45
                #height: root.height - _status_bar.height #-_header.height

            StatusBar:
                id:_status_bar
                size_hint: 1, 0.1
                #height: 50

            OutputParameters:
                id:_output_parameters
                size_hint: 1, 0.35

我输入必要文本的字段,每个字段都分配了 id

<InputParameters@GridLayout>

    prozess: _prozess
    material: _material
    haerte: _haerte
    rauheit: _rauheit

    cols: 2
    padding: 15

    #Prozess
    Label:
        text:'Prozess:'

    TextInput:
        id: _prozess
        hint_text:'Text'
        multiline: False

    #Material
    Label:
        text:'Material:'

    TextInput:
        id: _material
        hint_text:'Text'
        multiline: False

    # Haerte
    Label:
        text:'Haerte:'

    TextInput:
        id: _haerte
        hint_text:'Text'
        multiline: False

    # Rauheit
    Label:
        text:'Rauheit:'

    TextInput:
        id: _rauheit
        hint_text:'Text'
        multiline: False

和我的包含按钮的 StatusBar:

#: import statusbar StatusBar

<StatusBar@BoxLayout>

    orientation:'horizontal'
    padding: 5
    fs: 16
    Button:
        text: 'Clear'
        background_color: 0.0, 0.353, 0.663, 1.0
        size_hint: 0.4, 1
        font_size: 20

    Button:
        text: 'Submit'
        background_color: 0.0, 0.353, 0.663, 1.0
        size_hint: 0.4, 1
        font_size: 20
        on_press: root.btn_submit()

状态栏用于打印文本输入的按钮方法的导入 py.- 文件如下:

from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty

class StatusBar(BoxLayout):
    group_mode = False
    #translation = ListProperty(None)
    prozess = ObjectProperty(None)
    material = ObjectProperty(None)
    haerte = ObjectProperty(None)
    rauheit = ObjectProperty(None)

    def btn_submit(self):
        print("Prozess:", self.prozess.text, "Material:", self.material.text)

main.py 中提到了另外 2 个 .kv 文件,但我不认为它们#re 是该问题所必需的。 如果我 运行 应用程序工作并弹出,但是一旦我添加一些文本并点击我的 'Submit' 按钮我得到错误:“AttributeError: 'NoneType' abject has no attribute 'text'"

我知道单独的文件可能是问题所在并且令人困惑,但因为这只是应用程序的开始,代码会变得更大我想保持这种状态。我真的希望你能帮助我,因为我很沮丧...... 谢谢!

问题是你的代码:

print("Prozess:", self.prozess.text, "Material:", self.material.text)

引用 prozessmaterial 就好像它们是 StatusBar class 的属性一样,但它们实际上是 InputParameters [= 的属性25=].

我还没有测试过这个,但是你应该用类似的东西替换你的 btn_submit()

def btn_submit(self):
    ip = App.get_running_app().root.ids._input_parameters
    print("Prozess:", ip.prozess.text, "Material:", ip.material.text)

同样,我还没有测试过这段代码,但类似的东西应该可以工作。