【问题标题】:add search filter in kivy在kivy中添加搜索过滤器
【发布时间】:2017-11-09 13:26:43
【问题描述】:

test.py

    import sqlite3 as lite

    from kivy.uix.screenmanager import Screen
    from kivy.app import App
    from kivy.lang import Builder
    from kivy.core.window import Window
    from kivy.uix.popup import Popup
    from kivy.uix.treeview import TreeView, TreeViewLabel, TreeViewNode
    from kivy.uix.label import Label
    from kivy.properties import ObjectProperty

    Window.clearcolor = (0, 0.517, 0.705, 1)

    Window.size = (700, 530)

    con = lite.connect('fact.db')
    con.text_factory = str
    cur = con.cursor()


    def populate_tree_view(tree_view, parent, node):
        if parent is None:
            tree_node = tree_view.add_node(TreeViewLabel(text=node['node_id'],
                                                         is_open=True))
        else:
            tree_node = tree_view.add_node(TreeViewLabel(text=node['node_id'],
                                                         is_open=True), parent)

        for child_node in node['children']:
            populate_tree_view(tree_view, tree_node, child_node)



        rows = [(1, 'test1', 111), (2, 'test2', 112), (3, 'test3', 113), (4, 'test4', 114)]

    tree = [{'node_id': 'Test2',
             'children': []},
            {'node_id': 'Test3',
             'children': []}]


    class TreeViewLabel(Label, TreeViewNode):
        pass


    class TreeviewGroup(Popup):
        treeview = ObjectProperty(None)
        tv = ObjectProperty(None)

        def __init__(self, **kwargs):
            super(TreeviewGroup, self).__init__(**kwargs)
            self.tv = TreeView(root_options=dict(text="Test1"),
                               hide_root=False,
                               indent_level=4)
            for branch in tree:
                populate_tree_view(self.tv, None, branch)
            self.remove_widgets()
            self.treeview.add_widget(self.tv)

        def remove_widgets(self):
            for child in [child for child in self.treeview.children]:
                self.treeview.remove_widget(child)


    class GroupScreen(Screen):
        groupName = ObjectProperty(None)
        popup = ObjectProperty(None)

        def display_groups(self, instance):
            if len(instance.text) > 0:
                self.popup = TreeviewGroup()
                self.popup.open()


    class Group(App):

        rows = [(1, 'test1', 111), (2, 'test2', 112), (3, 'test3', 113), (4, 'test4', 114)]
        def build(self):
            self.root = Builder.load_file('test.kv')
            return self.root


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

test.kv

:kivy 1.10.0

<TreeViewLabel>:
    on_touch_down:
        app.root.stateName.text = self.text
        app.root.popup.dismiss()

<TreeviewGroup>:
    id: treeview
    treeview: treeview
    title: "Select City"
    size_hint: None, None
    size: 400, 400
    auto_dismiss: False

    BoxLayout
        orientation: "vertical"
        BoxLayout:
            id: treeview
        Button:
            size_hint: 1, 0.1
            text: "Close"
            on_release: root.dismiss()


<CustomLabel@Label>:
    text_size: self.size
    valign: "middle"
    padding_x: 5

<SingleLineTextInput@TextInput>:
    multiline: False

<GreenButton@Button>:
    background_color: 1, 1, 1, 1
    size_hint_y: None
    height: self.parent.height * 0.150

GroupScreen:
    stateName: stateName

    GridLayout:
        cols: 2
        padding : 30,30
        spacing: 10, 10
        row_default_height: '40dp'

        CustomLabel:
            text: 'State Name'

        SingleLineTextInput:
            id: stateName
            on_text: root.display_groups(self)

        CustomLabel:
            text: 'State Code'

        SingleLineTextInput:
            id: stateCode

        CustomLabel:
            text: 'City Name'

        SingleLineTextInput:
            id: cityName

        CustomLabel:
            text: 'Short Name'

        SingleLineTextInput:
            id: shortName

        CustomLabel:
            text: 'Pin Code'

        SingleLineTextInput:
            id: pinCode

        GreenButton:
            text: 'Ok'

        GreenButton:
            text: 'Cancel'

        Label:

        Label:

谁能帮帮我?
1.如何在'Test1'上添加搜索过滤器文本框。我们可以从List中搜索。如果有人键入Test1,那么只应该从treeview显示test1。
2. Test1 表现得像所有节点的父节点。如何删除此属性。如何将所有节点更改为像父节点
3.现在test1,test2,test3都是静态的,怎么变成动态的。

【问题讨论】:

    标签: python python-2.7 kivy kivy-language


    【解决方案1】:
    1. Test1 表现得像所有节点的父节点。如何删除此属性。如何将所有节点更改为像父节点

    您可以将Test1设置为子节点,然后将treeView root_options的text属性设置为''

    ...
    
    tree = [{'node_id': 'Test1',
            'children': []},
            {'node_id': 'Test2',
             'children': []},
            {'node_id': 'Test3',
             'children': []}]
    
    ...
    
    class TreeviewGroup(Popup):
        treeview = ObjectProperty(None)
        tv = ObjectProperty(None)
    
        def __init__(self, **kwargs):
            super(TreeviewGroup, self).__init__(**kwargs)
            self.tv = TreeView(root_options=dict(text=""),
                           hide_root=False,
                           indent_level=4)
    
    ...
    
    1. 如何在“Test1”上添加搜索过滤器文本框。我们可以从列表中搜索。如果有人键入 Test1,则只应从树视图中显示 test1。

    您可以在弹出窗口上定义一个过滤器方法来处理它,例如:

    class TreeviewGroup(Popup):
    
    ...
    
    def filter(self, f):
        self.treeview.clear_widgets()
        self.tv = TreeView(root_options=dict(text=""),
                           hide_root=False,
                           indent_level=4)
        new_tree = []
        for n in tree:
            if f.lower() in n['node_id'].lower():
                new_tree.append(n)
        for branch in new_tree:
            populate_tree_view(self.tv, None, branch)
    
        self.treeview.add_widget(self.tv)
    

    然后在用户输入重要的状态名称时调用它:

    ...
    
    class GroupScreen(Screen):
        groupName = ObjectProperty(None)
        popup = ObjectProperty(None)
    
        def display_groups(self, instance):
            if len(instance.text) > 4: #I choose 4 because it is the smallest length of your nodes
                if self.popup is None:
                    self.popup = TreeviewGroup()
                self.popup.filter(instance.text)
                self.popup.open()
    

    我希望这会有所帮助!

    更新:针对您的最后一个请求

    1. 将 ti 属性添加到弹出窗口(文本输入):

      ... 类 TreeviewGroup(弹出): 树视图 = 对象属性(无) tv = ObjectProperty(无) ti = 对象属性() ...

    然后编辑 .kv 文件:

    ...
    <TreeviewGroup>:
        id: treeview
        treeview: treeview
        title: "Select City"
        ti: ti
        size_hint: None, None
        size: 400, 400
        auto_dismiss: False
    
        BoxLayout
            orientation: "vertical"
            TextInput:
                id: ti
                size_hint_y: .1
                on_text: root.filter(self.text)
            BoxLayout:
                id: treeview
            Button:
                size_hint: 1, 0.1
                text: "Close"
                on_release: root.dismiss()
    ...
    

    别忘了编辑 display_groups 方法:

    ...
    class GroupScreen(Screen):
        groupName = ObjectProperty(None)
        popup = ObjectProperty(None)
    
        def display_groups(self, instance):
            if len(instance.text) > 0:
                if self.popup is None:
                    self.popup = TreeviewGroup()
                self.popup.filter(instance.text)
                self.popup.open()
    

    更新:将树更改为动态:

    ...
    
    # cur.execute("SELECT * FROM `m_state` order by state_id asc")
    # rows = cur.fetchall()
    # print(rows)
    rows = [(1, 'test1', 111), (2, 'test2', 112), (3, 'test3', 113), (4, 'test4', 114)]
    
    tree = []
    
    for r in rows:
        tree.append({'node_id': r[1], 'children': []})
    
    ...
    

    【讨论】:

    • 你能帮帮我吗?当我输入一些内容时,不要在州名文本框中输入任何内容但是选择城市弹出窗口应该打开并在 treeView root_options 上添加一个文本框(过滤框)顶部。我可以在哪里轻松过滤?如果我输入“tes”然后显示所有在 word 中包含“tes”字符串的列。然后我输入“test1”然后只有 test1 应该显示
    • @yashkumar 好的,我会更新我的答案,。对于静态到动态,我认为您只需设置树变量
    • 现在 test1,test2,test3 即将进入静态。如何将静态更改为动态。我的数据存储在行中 = [(1, 'test1', 111), (2, 'test2', 112 ), (3, 'test3', 113), (4, 'test4', 114)]
    • @yashkumar 您只需编辑树变量。我将其添加到我的答案中
    • 您能详细说明如何更改吗?
    猜你喜欢
    • 2019-11-11
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多