2016-08-29 2 views
0

In letzter Zeit habe ich einige Probleme mit dem Kivy Screenmanager. Ich kann die switch_to-Methode des Managers nicht verwenden, wenn ich von einer Klasse Screen darauf zugreife. In einer Screen Klasse gibt self.manager.switch_to den Fehler: AttributeError: 'NoneType' object has no attribute 'switch_to'. Ich bin ein bisschen verzweifelt. Unterhalb der einfachen App, die den Fehler erzeugt.Probleme mit Kivy ScreenManager

import kivy 
kivy.require("1.9.1") 

from kivy.app import App 
from kivy.uix.label import Label 
from kivy.uix.screenmanager import ScreenManager, Screen 

screen1 = True 


class Screen1(Screen): 
    def __init__(self, **kw): 
     super(Screen1, self).__init__(**kw) 
     self.add_widget(Label(text="Screen1")) 


class Screen2(Screen): 
    def __init__(self, **kw): 
     super(Screen2, self).__init__(**kw) 
     self.add_widget(Label(text="Screen2")) 


class BlackMenu(Screen): 
    def __init__(self, **kw): 
     super(BlackMenu, self).__init__(**kw) 
     if screen1: 
      self.manager.switch_to(Screen1()) 


class MyApp(App): 
    def build(self): 
     mymanager = ScreenManager() 
     mymanager.switch_to(BlackMenu(name="black")) 
     return mymanager 


if __name__ == "__main__": 
    MyApp().run() 
+0

ich denke, das Problem liegt in BlackMenu, weil während der Konstruktion das Instanz-Manager-Attribut None ist. – fins

Antwort

0

try Ihren Bildschirm-Manager als globaler Variable unter screen1 erklärt

import kivy 
kivy.require("1.9.1") 

from kivy.app import App 
from kivy.uix.label import Label 
from kivy.uix.screenmanager import ScreenManager, Screen 

screen1 = True 
screen_manager = ScreenManager() 

dann in Ihrer Build-Funktion fügen Sie Ihre Bildschirme gerade wie:

def build(self): 
    screen_manager.add_widget(Screen1(name='screen1')) 
    screen_manager.add_widget(Screen2(name='screen2')) 
    screen_manager.add_widget(BlackMenu(name='black_menu')) 
    return screen_manager 

dann in Ihrem schwarzen Bildschirm kann man tun:

class BlackMenu(Screen): 
def __init__(self, **kw): 
    super(BlackMenu, self).__init__(**kw) 
    if screen_manager.current == 'screen1': 
     screen_manager.switch_to(Screen1()) 

Denken Sie jedoch daran, dass beim Wechseln zu einem Bildschirm dieser Bildschirm von screen_manager childs entfernt wird, damit Sie ihn erneut hinzufügen müssen. viel Glück