2015-04-15 90 views
0

我試圖在屏幕之間切換,但我的屏幕管理器失敗,說它有一種類型的NoneType。 我懷疑我可能無法正確引用我的屏幕管理器? 這將是什麼正確的方法?Python Kivy屏幕管理器的'AttributeError'

我採取的方法是直接從文檔,所以我不確定我要去哪裏錯了。

錯誤:

 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() 
+1

您的多重繼承可能是災難的祕訣。一般而言,您應該只繼承一個窗口小部件類型,並將其他窗口的實例添加到窗口小部件。 – inclement

+0

@inclement我不認爲這是必然的,如果兩個小部件做不同的事情,那麼不應該存在從兩者繼承的問題。一個問題可能是Screen本身是RelativeLayout的子類,另外從BoxLayout繼承可能會破壞事情。 – syntonym

+0

這不一定是真實的,因此只是一個災難的祕訣。由於窗口小部件的組成部分並不打算以這種方式工作,因此我們儘量避免出現問題,這就是爲什麼我建議在某些情況下避免它的原因。 – inclement

回答

1

你不使用你的屏幕管理。您創建一個ScreenManager sm並添加屏幕,但在此之後,您不使用它,而是創建一個新的MainScreen(未連接到您的管理器)。您的根部件應該是您的屏幕管理器,這意味着您的build()函數應返回ScreenManager。在文檔中,這是與return(sm)對齊。

您還需要在創建屏幕時爲其命名。你可以通過Screen(name="myscreen")來做到這一點,否則你的經理將不知道這些名稱會影響到哪個屏幕。

+0

但是,當我返回我的屏幕管理器而不是我的MainWindow時,應用程序變爲空白。我想要它顯示我的MainWindow。我嘗試將我的屏幕管理器添加到我的主窗口中作爲小部件,但他們的應用程序再次變白。我傳遞名稱在我的.kv文件。 – sebb

+0

它適用於我,如果你把'sm = ScreenManager(); sm.add_widget(...)...'進入'def build(self):'函數。我無法解釋爲什麼。 – syntonym

0

您的應用可能不會顯示屏幕,因爲即使您將它們添加到屏幕管理器,PystokApp()類也不會返回屏幕管理器。

不是返回根,而是返回sm。