【问题标题】:Kivy select an item in ListView from codeKivy 从代码中选择 ListView 中的一个项目
【发布时间】:2013-10-18 22:08:49
【问题描述】:

我使用 ListAdapter 在 ListView 中显示数据。

如何从代码中选择 ListView 中的项目?

【问题讨论】:

    标签: python listview kivy


    【解决方案1】:

    您可以使用get_view() 方法从ListAdapter 获取您的列表项。如果列表项是ListItemButton,那么您可以使用ButtonBehavior mixin 的trigger_action() 方法模拟按下(ButtonBehaviorButton 的父项,ButtonListItemButton 的父项)。这也会触发on_selection_change 事件,因此您可能需要一个变量来将此与正常选择区分开来。一个例子:

    from kivy.uix.listview import ListView, ListItemButton
    from kivy.uix.boxlayout import BoxLayout
    from kivy.adapters.dictadapter import ListAdapter
    from kivy.uix.button import Button
    from random import randint
    
    class MainView(BoxLayout):
        def __init__(self, **kwargs):
            kwargs['cols'] = 2
            super(MainView, self).__init__(**kwargs)
            self.orientation = 'vertical'
    
            self.list_adapter = ListAdapter(data=["Item #{0}".format(i) for i in range(10)], cls=ListItemButton, sorted_keys=[])
            self.list_adapter.bind(on_selection_change=self.selection_change)
            list_view = ListView(adapter=self.list_adapter)
            self.add_widget(list_view)
            self.add_widget(Button(text="select random item", on_press=self.callback))
    
        def callback(self, instance):
            index = randint(0, 9)
            self.change_from_code = True
            if not self.list_adapter.get_view(index).is_selected:
                self.list_adapter.get_view(index).trigger_action(duration=0)
            self.change_from_code = False
    
        def selection_change(self, adapter, *args):
            if self.change_from_code:
                print "selection change from code"
            else:
                print "selection changed by click"
    
    if __name__ == '__main__':
        from kivy.base import runTouchApp
        runTouchApp(MainView(width=800))
    

    【讨论】:

      【解决方案2】:

      ListAdapter 函数handle_selection 已经处理了这个问题。它不在文档中,但在代码中。您只需要知道要查找的列表项即可。

      item =  list_adapter.get_data_item(0)
      list_adapter.handle_selection(item)
      

      如果您不想触发on_selection_change 事件,请添加True。这告诉handle_selection 不要触发调度。

      item =  list_adapter.get_data_item(0)
      list_adapter.handle_selection(item, True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-29
        • 1970-01-01
        相关资源
        最近更新 更多