Python Kivy屏幕管理器'AttributeError'

时间:2015-04-15 14:24:50

标签: python kivy

我正在尝试在屏幕之间切换,但我的屏幕管理器失败,说它有一种类型的NoneType。 我怀疑我可能无法正确引用我的屏幕管理器? 对此有什么正确的解决方法?

我采取的方法直接来自文档,所以我不确定我哪里出错了。

错误:

      on_release: root.manager.current = 'AboutUsWindow'
 AttributeError: 'NoneType' object has no attribute 'current'

我的.kv文件:

<MainWindow>:
    name: "MainWindow"
    BoxLayout:
        orientation: "horizontal"
        ActionBar:
            pos_hint: {'top':1}
            use_separator: True
            background_color: 0, 1, 1, 1
            ActionView:
                use_separator: True
                ActionPrevious:
                    with_previous: True
                ActionOverflow:
                    ActionButton:
#                       text: "some text"
                        text: root.name
                        on_release: root.manager.current = 'AboutUsWindow'
                    ActionButton:
                        text: "sponsors"
                        on_release: root.manager.current = 'AboutUsWindow'
                    ActionButton:
                        text: "contact"
                    ActionButton:
                        text: "event"


<AboutUsWindow>:
    name: "AboutUsWindow"
    Label:
        text: "asdasdasd"
    Button:
        size: (123,123)

我的main.py文件:

# Here are imports which i did not include
class MainWindow(Screen, BoxLayout, CoverImage):
    pass


class AboutUsWindow(Screen, BoxLayout, CoverImage):
    pass


sm = ScreenManager()
sm.transition = FadeTransition()
sm.add_widget(MainWindow())
sm.add_widget(AboutUsWindow())

class PystokApp(App):
    def build(self):
        root = MainWindow(source='images/logo.jpg')
        return root
        # main = MainWindow()
        # Window.size = main.size
        # return MainWindow()

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

2 个答案:

答案 0 :(得分:1)

您不使用ScreenManager。您创建了一个ScreenManager sm并为其添加了屏幕,但在此之后您不会使用它,而是创建一个新的MainScreen(未与您的经理相关联)。您的根Widget应该是您的屏幕管理器,这意味着您的build()函数应该返回ScreenManager。在文档中,这是return(sm)

您还需要在创建屏幕时为其命名。您可以Screen(name="myscreen")执行此操作,否则您的经理将不知道这些名称与哪些屏幕相对应。

答案 1 :(得分:0)

您的应用可能没有显示屏幕,因为即使您将它们添加到屏幕管理器,您的PystokApp()类也不会返回屏幕管理器。

不是返回root,而是尝试返回sm。