自定义事件:TypeError:“NoneType”对象不可下标

Posted

技术标签:

【中文标题】自定义事件:TypeError:“NoneType”对象不可下标【英文标题】:Custom event : TypeError: 'NoneType' object is not subscriptable 【发布时间】:2014-07-04 22:03:42 【问题描述】:

我使用 Kivy 1.8.0 并尝试使用自定义事件来管理 yesNo 弹出窗口。此代码是在互联网上找到的。我只找到了这个示例,我想修改此代码以进行多个弹出窗口管理,但运行时出现错误。

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
from kivy.uix.popup import Popup
from kivy.properties import StringProperty

Builder.load_string('''
<ConfirmPopup>:
    cols: 1
        Label:
            text: root.text
        GridLayout:
            cols: 2
            size_hint_y: None
            height: '44sp'
            Button:
                text: 'Yes'
                on_release: root.dispatch('on_reponse_user','yes')
            Button:
                text: 'No'
                on_release: root.dispatch('on_reponse_user', 'no')
''')

不知道问题出在kv的字符串还是代码中。

class ConfirmPopup(GridLayout):
    text = StringProperty('')

    def __init__(self,**kwargs):
        self.register_event_type('on_reponse_user')
        super(ConfirmPopup,self).__init__(**kwargs)

    def on_reponse_user(self, instance, answer):
        pass    


class PopupTest(App):
    def build(self):
        content = ConfirmPopup(text='Do You Love Kivy?')
        content.bind(on_reponse_user=self.on_answer_callback)
        self.popup = Popup(title="Answer Question",
                           content=content,
                           size_hint=(None, None),
                           size=(480,400),
                           auto_dismiss= False)
        self.popup.open()

    def on_answer_callback(self, instance, answer):
        print("USER ANSWER: " , repr(answer))
        self.popup.dismiss()

if __name__ == '__main__':
    PopupTest().run()

当我运行此代码时,出现此错误:

 Traceback (most recent call last):
   File "F:\Kivy-1.8.0\test_event.py", line 24, in <module>
     ''')
   File "F:\Kivy-1.8.0\kivy\kivy\lang.py", line 1491, in load_string
     parser = Parser(content=string, filename=fn)
   File "F:\Kivy-1.8.0\kivy\kivy\lang.py", line 1049, in __init__
     self.parse(content)
   File "F:\Kivy-1.8.0\kivy\kivy\lang.py", line 1122, in parse
     objects, remaining_lines = self.parse_level(0, lines)
   File "F:\Kivy-1.8.0\kivy\kivy\lang.py", line 1271, in parse_level
     if current_property[:3] == 'on_':
 TypeError: 'NoneType' object is not subscriptable

我不知道为什么自定义事件有错误。像 Kivy 中的文档一样,可以添加自定义事件。

【问题讨论】:

【参考方案1】:

肯定会在 kivy 解析器中引发错误,这表明错误在您尝试加载的字符串中。它看起来像字符串中的缩进问题。

如果该示例取自 here,那么 GitHub 代码格式化程序可能隐藏的 sn-p 中的缩进级别混合有些奇怪。如果您的缩进与该页面上的一样,请尝试完全按照此处的格式复制您发布的代码 sn-p,看看是否可以解决问题。

【讨论】:

不确定是关于缩进。我已经在 kv 文件中提取了字符串文本,并且检查了每个缩进部分。同样的问题 但是Label的缩进级别和test: root.text的缩进级别之间是否有四个或八个空格? 是的,是的,你最棒!!!问题是关于标签和以下每一行的说明。从早上开始我就试图解决这个错误......【参考方案2】:

异常名称表明current_propertyNone,你应该看看它。顺便说一句,为什么你的活动名称是'on_reponse_user'?不应该是on_reSponse_user吗?如果该字符串在 Kivy 中除了名称之外还有其他意义,那可能是您的问题的根源。

【讨论】:

'on_reponse_user' 只是我定义的一个名字。问题是缩进。【参考方案3】:

我在笔记本电脑上也遇到了同样的问题,但是当我在 android 中尝试相同的代码时,它工作正常。 只需使用 kivy 启动器和 python 在 android 中尝试此代码

【讨论】:

【参考方案4】:

就我而言,我通过查看我的 kv 文件并发现按钮功能中缺少一个选项卡来解决问题。所以按钮没有链接到布局:

【讨论】:

以上是关于自定义事件:TypeError:“NoneType”对象不可下标的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:“NoneType”对象在 Python 中不可迭代

TypeError:调用键函数时“NoneType”对象不可迭代

Anvil 错误:TypeError:“NoneType”对象不可下标

在执行并行 ssh 时获取“TypeError:'NoneType' 对象不可迭代”

运行测试时突然出现“TypeError:'NoneType'对象不可迭代

Python:Concurrent.Futures 错误 [TypeError:'NoneType' 对象不可调用]