Skip to main content
 首页 » 编程设计

python之Kivy:为什么 ListView 在 .kv 文件中声明不同

2025年05月04日13zhengyun_ustc

对 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) 
""")