Kivy,TypeError:'NoneType'对象没有属性'__getitem __'

时间:2016-01-20 05:03:31

标签: python kivy

在尝试运行示例kivy应用程序时,我遇到了上述错误。

这是python代码:

main.py。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen, ScreenManager, FadeTransition

class MyScreenManager(ScreenManager):
    pass

class MainScreen(Screen):
    pass

class MailScreen(Screen):
    pass

class ProjectScreen(Screen):
    pass

class IntroScreen(Screen):
    pass

class GsaMain(BoxLayout):
    pass

class GsamApp(App):
    def build(self):
        return MyScreenManager()

GsamApp().run()

名为gsam.kv的kivy文件

MyScreenManager:
    IntroScreen:
    MainScreen:
    PrjcScreen:
    MailScreen:
    ChatScreen:

<IntroScreen>:
    name: 'introscreen'
    BoxLayout:
        Label:
            text: 'Welcome to GSAM'
            font_size: 35
    BoxLayout:
        Label:
            text: "Login"
        TextInput:
            id: login
            text: "Login"
        Button:
            text: "Connect"
            on_release: root.current = 'mainpage'
    BoxLayout:
        Button:
            text: 'Project Page'
            font_size: 25
            on_release: app.root.current = 'main'

<MainScreen>:
    name: 'main'
    BoxLayout:
        Label:
            text: 'Your GSAM Portal'
            font_size: 35
    BoxLayout:
        Button:
            text: 'Check Mails'
            font_size: 25
            on_release: app.root.current = 'mailscreen'
            canvas:
            color: rgba: 1,0,0,1
                Rectangle:
                    size: 50, 50
                    Label: "Post Projects"
                    id: projct
                Rectangle:
                    size: 50, 50
                    Label: "Messages"
                    id: msgs

<MailScreen>:
    name: 'mailscreen'
    BoxLayout:
        Label:
            text: 'GSAM Mail'
            font_size: 35
    BoxLayout:
        Button:
            text: 'Chat'
            font_size: 25
            on_release: app.root.current = 'chat'
<ChatScreen>:
    name: 'chatscreen'
    BoxLayout:
        Label:
            text: 'Chat with your Colleagues'
            font_size: 35
    BoxLayout:
        Button:
            text: 'Home'
            font_size: 25
            on_release: app.root.current = 'main'

<PrjcScreen>:
    name: 'prjcscreen'
    BoxLayout:
        Label:
            text: 'Community Projects'
            font_size: 35
    BoxLayout:
        Button:
            text: 'community Projects'
            font_size: 25
            on_release: app.root.current = 'main'
            GridLayout:
                cols: 2
                rows: 4
                padding: 5
                spacing: 5
                    Label:
                        text: "Project Title"
                    TextInput:
                        id: ptitle
                    Label:
                        text: "Project Description"
                    TextInput:
                        id: pdescr

我无法弄清楚指向的追溯是什么。

 Traceback (most recent call last):
   File "main.py", line 28, in <module>
     GsamApp().run()
   File "/home/afidegnum/gsam/local/lib/python2.7/site-packages/kivy/app.py", line 797, in run
     self.load_kv(filename=self.kv_file)
   File "/home/afidegnum/gsam/local/lib/python2.7/site-packages/kivy/app.py", line 594, in load_kv
     root = Builder.load_file(rfilename)
   File "/home/afidegnum/gsam/local/lib/python2.7/site-packages/kivy/lang.py", line 1749, in load_file
     return self.load_string(data, **kwargs)
   File "/home/afidegnum/gsam/local/lib/python2.7/site-packages/kivy/lang.py", line 1796, in load_string
     parser = Parser(content=string, filename=fn)
   File "/home/afidegnum/gsam/local/lib/python2.7/site-packages/kivy/lang.py", line 1185, in __init__
     self.parse(content)
   File "/home/afidegnum/gsam/local/lib/python2.7/site-packages/kivy/lang.py", line 1287, in parse
     objects, remaining_lines = self.parse_level(0, lines)
   File "/home/afidegnum/gsam/local/lib/python2.7/site-packages/kivy/lang.py", line 1384, in parse_level
     level + 1, lines[i:], spaces)
   File "/home/afidegnum/gsam/local/lib/python2.7/site-packages/kivy/lang.py", line 1384, in parse_level
     level + 1, lines[i:], spaces)
   File "/home/afidegnum/gsam/local/lib/python2.7/site-packages/kivy/lang.py", line 1437, in parse_level
     if current_property[:3] == 'on_':
 TypeError: 'NoneType' object has no attribute '__getitem__'

我需要在python代码中定义函数on_release吗?

2 个答案:

答案 0 :(得分:2)

main.py

  • 没有ChatScreen。定义一个:

    class ChatScreen(Screen):
        pass
    
  • ProjectScreen应重命名为PrjcScreen以匹配gsam.kv中的名称。 (或更改PrjcScreen中的gsam.kv

gsam.kv

  • color - &gt; Color

    color: rgba: 1,0,0,1
    

    - &GT;

    Color:
        rgba: 1,0,0,1
    
  • Rectangle没有Label个参数:

            Rectangle:
                size: 50, 50
                # Label: "Post Projects"  <---
                id: projct
            Rectangle:
                size: 50, 50
                # Label: "Messages"  <---
                id: msgs
    

答案 1 :(得分:1)

我已经处理了您的代码,并生成了一个有效的代码。除了上面给出的建议外,我还注意到您的.kv文件中存在许多缩进问题。我在必要时发表了评论,做出了这些更改。在下面找到工作代码:

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout   
from kivy.uix.screenmanager import Screen, ScreenManager, FadeTransition

class MyScreenManager(ScreenManager):
    pass

class MainScreen(Screen):
    pass

class MailScreen(Screen):
    pass

class ChatScreen(Screen):
    pass

class ProjectScreen(Screen):
    pass

class IntroScreen(Screen):
    pass

class GsaMain(BoxLayout):
    pass

class GsamApp(App):
    def build(self):
        sm = MyScreenManager()
        sm.add_widget(IntroScreen(name="introscreen"))
        sm.add_widget(MainScreen(name="main"))
        sm.add_widget(MailScreen(name="mailscreen"))
        sm.add_widget(ProjectScreen(name="prjcscreen"))
        sm.add_widget(ChatScreen(name='chat'))
        return sm

GsamApp().run()

gsma.kv

<IntroScreen>:
    name: 'introscreen'
    BoxLayout:
        orientation: 'vertical'
        padding: 100,100
        spacing: 50
        Label:
            text: 'Welcome to GSAM'
            font_size: 35
        Label:
            text: "Login"
        TextInput:
            id: login
            text: "Login"

   # BoxLayout:     # this makes the button widget covers the whole page. remove it
        Button:
            text: "Connect"
            on_release: app.root.current = 'main'
        Button:
            text: 'Project Page'
            font_size: 15
            on_release: app.root.current = 'prjcscreen'

<MainScreen>:
    name: 'main'
    BoxLayout:
        orientation:'vertical'
        padding:100,100
        spacing:50
        Label:
            text: 'Your GSAM Portal'
            font_size: 35
        # BoxLayout: # remove this. Dont repeat BoxLayout for every widget u want show on the screen except for a good reason. Or better still, ident the BoxLayout as a child of the First Boxlayout
        Button:
            text: 'Check Mails'   # text, font_size,on_realease must not  be in the same line with button
            font_size: 25
            on_release: app.root.current = 'mailscreen'

            canvas.before:
                Color:              # I have reidented Color
                     rgba: 1,0,0,1   # this line must be here
                Rectangle:          # Rectangle must ident with Color
                    size: 50, 50
                    # Label: "Post Projects"     # remove the label here
                    id: projct                   # and place it either before of after canvas class
                Rectangle:
                    size: 50, 50
                    # Label: "Messages"
                    id: msgs

<MailScreen>:
    name: 'mailscreen'
    BoxLayout:
        Label:
            text: 'GSAM Mail'
            font_size: 35
        Button:
            text: 'Chat'
            font_size: 25
            on_release: app.root.current = 'chat'

 <ChatScreen>:
    name: 'chatscreen'
    BoxLayout:
        Label:
            text: 'Chat with \nyour Colleagues'
            font_size: 35
        Button:
            text: 'Home'
            font_size: 25
            on_release: app.root.current = 'main'

<ProjectScreen>:
    name: 'prjcscreen'
    BoxLayout:
        Label:
            text: 'Community Projects'
            font_size: 35

        Button:
            text: 'community Projects'
            font_size: 25
            on_release: app.root.current = 'main'
            GridLayout:
                cols: 2
                rows: 4
                padding: 5
                spacing: 5
                Label:
                    text: "Project Title"
                TextInput:
                    id: ptitle
                Label:
                    text: "Project Description"
                TextInput:
                    id: pdescr