使用屏幕管理器从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)
我有以下代码在从 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)