将自定义视图 类 添加到屏幕管理器
Adding custom view classes to Screen Manager
我只是想制作一些我发现的示例代码,这些代码将小部件动态添加到与屏幕管理器合并的视图中,但我无法让它工作。
我找到了这个示例 Associating Screens with GridLayout classes in kivy,据我所知,我已经实施了那里定义的策略,但我不断收到 kivy.uix.screenmanager.ScreenManagerException:ScreenManager 只接受屏幕小部件。
编辑:这是我更新的代码。现在出现错误:AttributeError:MainScreen 实例没有属性 'add_widget'
from kivy.uix.modalview import ModalView
from kivy.uix.listview import ListView
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder
from kivy.app import App
import citylists
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
#using 'sla'...whatever that means...
Builder.load_string("""
#:import ListItemButton kivy.uix.listview
#:import sla kivy.adapters.listadapter
<ListViewModal>:
ListView:
size_hint: .8, .8
adapter:
sla.ListAdapter(
data=["Item #{0}".format(i) for i in range(100)],
cls=ListItemButton.ListItemButton)
""")
class ListViewModal(ModalView):
def __init__(self, **kwargs):
super(ListViewModal, self).__init__(**kwargs)
class MainView(Screen):
def __init__(self, **kwargs):
kwargs['cols'] = 1
super(MainView, self).__init__(**kwargs)
listview_modal = ListViewModal()
self.add_widget(listview_modal)
class MainScreen():
pass
mainscreen=MainScreen()
mainlayout = MainView()
mainscreen.add_widget(mainlayout)
class CARApp(App):
screen_manager = None
def build(self):
self.screen_manager = ScreenManager()
self.screen_manager.add_widget(mainscreen)
if __name__ == '__main__':
CARApp().run()
self.screen_manager.add_widget(MainScreen)
您正在传递实际的 class MainScreen,但您需要添加 class 的 实例 ,即 MainScreen()
。
编辑,虽然仔细查看了您的代码,但您可能想要添加您已经创建的实例,即 mainscreen
。将此小部件创建移动到构建方法中也可能更整洁,因为那是实际需要它的地方。
我只是想制作一些我发现的示例代码,这些代码将小部件动态添加到与屏幕管理器合并的视图中,但我无法让它工作。
我找到了这个示例 Associating Screens with GridLayout classes in kivy,据我所知,我已经实施了那里定义的策略,但我不断收到 kivy.uix.screenmanager.ScreenManagerException:ScreenManager 只接受屏幕小部件。
编辑:这是我更新的代码。现在出现错误:AttributeError:MainScreen 实例没有属性 'add_widget'
from kivy.uix.modalview import ModalView
from kivy.uix.listview import ListView
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder
from kivy.app import App
import citylists
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
#using 'sla'...whatever that means...
Builder.load_string("""
#:import ListItemButton kivy.uix.listview
#:import sla kivy.adapters.listadapter
<ListViewModal>:
ListView:
size_hint: .8, .8
adapter:
sla.ListAdapter(
data=["Item #{0}".format(i) for i in range(100)],
cls=ListItemButton.ListItemButton)
""")
class ListViewModal(ModalView):
def __init__(self, **kwargs):
super(ListViewModal, self).__init__(**kwargs)
class MainView(Screen):
def __init__(self, **kwargs):
kwargs['cols'] = 1
super(MainView, self).__init__(**kwargs)
listview_modal = ListViewModal()
self.add_widget(listview_modal)
class MainScreen():
pass
mainscreen=MainScreen()
mainlayout = MainView()
mainscreen.add_widget(mainlayout)
class CARApp(App):
screen_manager = None
def build(self):
self.screen_manager = ScreenManager()
self.screen_manager.add_widget(mainscreen)
if __name__ == '__main__':
CARApp().run()
self.screen_manager.add_widget(MainScreen)
您正在传递实际的 class MainScreen,但您需要添加 class 的 实例 ,即 MainScreen()
。
编辑,虽然仔细查看了您的代码,但您可能想要添加您已经创建的实例,即 mainscreen
。将此小部件创建移动到构建方法中也可能更整洁,因为那是实际需要它的地方。