对 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
""")
我什至遇到了this发布,和this one too ,说方法 #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
我在这里错过了什么?
提前致谢。
请您参考如下方法:
ListAdapter 不是 Widget,因此您不能使用您尝试使用的语法。我认为您可以做的最接近代码的是以下代码,以实现更 Kivyonic 的外观。注意我改变了进口。这看起来类似于向 Canvas 添加说明的方式:
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)
""")
