2017-08-12 40 views
0

从ListAdapter中的按钮调用方法open_project时,下面的代码会导致AttributeError。在使用屏幕管理器访问kivy应用程序中ListAdapter的方法时出现AttributeError

AttributeError的:“AppScreenManager”对象有没有属性“open_project”

我如何可以访问open_project方法在主屏幕类从当前屏幕?

在main.py我创建的应用程序:

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

文件manager.py

from kivy.uix.screenmanager import ScreenManager 

class AppScreenManager(ScreenManager): 
    pass 

文件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' 

文件startscreen.kv

<StartScreen>: 
    name: 'StartScreen' 

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

然后在文件homescreen.py,我有相同的序列下面的代码片段:

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 

在文件homescreen.kv我有以下几点:

# 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) 

回答

0

您的问题就在这里在homescreen.kv:

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

它不会工作,因为app.root是你ScreenManager,不是你的HomeScreen,因为它的工作,你需要致电open_projectHomeScreen,现在,我没有看到kv代码instanciating HomeScreen,但你可以给它一个ID,并使用app.root.ids.home_screen,但有另一种方式,因为ScreenManager提供了一种按名称获取对屏幕的引用的方法。

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

太棒了!感谢您的明确答复和见解。现在我明白如何获得对屏幕的引用。再次感谢。 –

相关问题