2

对list_simple_in_kv.py稍作改动以使用ListAdapter而不是SimpleListAdapter,我发现方法 #1 有效:

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

#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(GridLayout):

    def __init__(self, **kwargs):
        kwargs['cols'] = 1
        super(MainView, self).__init__(**kwargs)

        listview_modal = ListViewModal()

        self.add_widget(listview_modal)

class TestApp(App):
    def build(self):
        root = MainView()
        return root

if __name__ == '__main__':
    TestApp().run()

但是将 kv 文件更改为这种方式(与我遇到的其他 kv API 最一致的方式)失败了:

Builder.load_string("""
#:import ListItemButton kivy.uix.listview
#:import ListAdapter kivy.adapters.listadapter

<ListViewModal>:
    size_hint: None, None
    size: 400, 400
    ListView:
        size_hint: .8, .8
        ListAdapter:
            data: ["Item #{0}".format(i) for i in range(100)]
            cls: ListItemButton.ListItemButton
""")

我什至看到了这篇文章,还有这篇文章,说方法#2应该在master中工作,但它会产生一个异常:

File "C:\Python27\lib\site-packages\kivy\adapters\adapter.py", line 102, in __init__
     raise Exception('adapter: input must include data argument')
 Exception: adapter: input must include data argument

我在这里想念什么?

提前致谢。

4

2 回答 2

1

ListAdapter 不是小部件,因此您不能使用您尝试使用的语法。我认为最接近您可以为代码实现更多 Kivyonic 外观的方法如下。请注意,我更改了导入。这看起来类似于向画布添加指令的方式:

Builder.load_string("""
#:import ListItemButton kivy.uix.listview.ListItemButton
#:import ListAdapter kivy.adapters.listadapter.ListAdapter

<ListViewModal>:
    size_hint: None, None
    size: 400, 400
    ListView:
        size_hint: .8, .8
        adapter:
            ListAdapter(data=["Item #{0}".format(i) for i in range(100)], cls = ListItemButton)
""")

** 编辑 **

您还更改了size_hint,因此之前的代码看起来与原始代码非常不同。这个看起来和原版一样。

Builder.load_string("""
#:import ListItemButton kivy.uix.listview.ListItemButton
#:import ListAdapter kivy.adapters.listadapter.ListAdapter

<ListViewModal>:
    ListView:
        size_hint: .8, .8
        adapter:
            ListAdapter(data=["Item #{0}".format(i) for i in range(100)], cls = ListItemButton)
""")
于 2013-06-14T04:14:54.547 回答
0

我不确定这个答案,但您没有向该adapter属性添加任何内容。尝试这个:

Builder.load_string("""
#:import ListItemButton kivy.uix.listview
#:import ListAdapter kivy.adapters.listadapter

<ListViewModal>:
    size_hint: None, None
    size: 400, 400
    ListView:
        size_hint: .8, .8
        adapter:
            ListAdapter.ListAdapter:
                data: ["Item #{0}".format(i) for i in range(100)]
                cls: ListItemButton.ListItemButton
""")

我同意 sla.ListAdapter 不清楚。通常我们可以直接访问该类。告诉我这是否有效:

Builder.load_string("""
#:import ListItemButton kivy.uix.listview.ListItemButton
#:import ListAdapter kivy.adapters.listadapter.ListAdapter

<ListViewModal>:
    size_hint: None, None
    size: 400, 400
    ListView:
        size_hint: .8, .8
        adapter:
            ListAdapter:
                data: ["Item #{0}".format(i) for i in range(100)]
                cls: ListItemButton
""")

请注意,我更改了ListItemButtonand的导入ListAdapter

于 2013-06-14T03:45:38.367 回答