2017-08-12 105 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

太棒了!感謝您的明確答覆和見解。現在我明白如何獲得對屏幕的引用。再次感謝。 –

相關問題