2017-08-12 4 views
0

J'ai le code suivant provoquant une erreur Attribute lors de l'appel de la méthode open_project à partir d'un bouton dans un ListAdapter.AttributeError lors de l'accès à la méthode depuis ListAdapter dans l'application kivy à l'aide de screenmanager

AttributeError: objet « AppScreenManager » n'a pas d'attribut « open_project »

Comment puis-je accéder à la méthode open_project dans l'écran d'accueil de classe à partir de l'écran actuel?

En main.py je crée l'application:

from kivy.app import App 
from manager import AppScreenManager 
from startscreen import StartScreen 
from kivy.core.window import Window 

class PdesignerApp(App): 

    def build(self): 
     sm = AppScreenManager() 
     sm.add_widget(StartScreen()) 
     return sm 

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

Fichier manager.py

from kivy.uix.screenmanager import ScreenManager 

class AppScreenManager(ScreenManager): 
    pass 

Fichier startscreen.py

from kivy.uix.screenmanager import Screen 
from kivy.lang import Builder 
from kivy.clock import Clock 

Builder.load_file('startscreen.kv') 

class StartScreen(Screen): 

    def __init__(self, **kwargs): 
     super(StartScreen, self).__init__(**kwargs) 
     Clock.schedule_once(self.start, 1) 

    def start(self, *args): 
     if not self.manager.has_screen('HomeScreen'): 
      from homescreen import HomeScreen 
      self.manager.add_widget(HomeScreen()) 
     self.manager.current = 'HomeScreen' 

Fichier startscreen.kv

<StartScreen>: 
    name: 'StartScreen' 

    BoxLayout: 
     orientation: "vertical" 
     Image: 
      source: './images/splash-foto.jpg' 

Ensuite, dans le homescreen.py, j'ai les fragments de code suivants dans la même séquence:

from kivy.uix.listview import ListItemButton 

class ProjectButton(ListItemButton): 
    pass 

class HomeScreen(Screen): 
    #and some definitions here etc. 

    def __init__(self, **kwargs): 
     super(HomeScreen, self).__init__(**kwargs) 
     #and a list of initialisations here 

    def open_project(self, project): 
     #and quite some processing code here 

Dans le fichier homescreen.kv je donne les résultats suivants:

# File: homescreen.kv 
#: import Factory kivy.factory.Factory 
#: import homescreen homescreen 
#: import ListAdapter kivy.adapters.listadapter.ListAdapter 

<ProjectButton>: 
    background_normal: '' 
    background_down: './images/ProjList-sel.png' 
    on_release: app.root.open_project(self.text) 

<HomeScreen>: 
    name: 'HomeScreen' 
    project_results_list: project_results_list 

    BoxLayout: 
     ListView: 
      id: project_results_list 
      adapter: 
       ListAdapter(data=[], args_converter=lambda row_index, 
          an_obj: {'text': an_obj,'size_hint_y': None,'height': 25}, 
          cls=homescreen.ProjectButton) 

Répondre

0

votre question est ici en homescreen.kv:

on_release: app.root.open_project(self.text) 

il ne fonctionnera pas parce que app.root est votre ScreenManager, pas votre 0.123., pour que cela fonctionne, vous devez appeler open_project sur une référence à votre HomeScreen, maintenant, je ne vois pas le code kv instanciant HomeScreen, mais vous pouvez lui donner un identifiant, et utiliser app.root.ids.home_screen, mais il y a une autre façon, puisque ScreenManager donne un moyen d'obtenir une référence à un écran, par son nom.

on_release: app.root.get_screen('HomeScreen').open_project(self.text) 
+0

Super! Merci pour votre réponse claire et les idées. Maintenant, je comprends comment obtenir des références aux écrans. Merci encore. –