使用屏幕管理器从kivy应用程序中的ListAdapter访问方法时出现AttributeError

AttributeError when accessing method from ListAdapter in kivy app using screenmanager

我有以下代码在从 ListAdapter 中的按钮调用方法 open_project 时导致 AttributeError。

AttributeError: 'AppScreenManager' 对象没有属性 'open_project'

如何从当前屏幕访问 class 主屏幕中的 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)

您的问题在 homescreen.kv 中:

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

它不会工作,因为 app.root 是你的 ScreenManager,而不是你的 HomeScreen,要让它工作,你需要调用 open_project你的 HomeScreen,现在,我没有看到 kv 代码实例化 HomeScreen,但你可以给它一个 ID,然后使用 app.root.ids.home_screen,但还有另一种方法,因为 [=13] =] 提供了一种通过名称获取屏幕引用的方法。

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