How to dynamically generate Kivy objects
<p>So I figure out how to dynamically add labels to Kivy, but then I realized 
that Kivy has a listview module already, and that that would make things easier. I found this <a href="https://stackoverflow.com/questions/25981827/python-kivy-listview-how-to-delete-selected-listitembutton">Python Kivy ListView: How to delete selected ListItemButton?</a> answer useful in learning about implementing a listview, but am wondering how I could add a two column listview that is updated with text from two textboxes. I edited the code in the example as a proof of concept for what I want to do and what I have so far is:</p>

<pre><code># main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.listview import ListItemButton


class TaskButton(ListItemButton):
    pass


class TodoRoot(BoxLayout):
    task_input = ObjectProperty()
    task_list = ObjectProperty()

    def add_task(self):
        self.task_list.adapter.data.extend([self.task_input_1.text + " | " + self.task_input_2.text])
        self.task_list._trigger_reset_populate()

    def del_task(self, *args):
        if self.task_list.adapter.selection:
            selection = self.task_list.adapter.selection[0].text
            self.task_list.adapter.data.remove(selection)
            self.task_list._trigger_reset_populate()


class TodoApp(App):
    def build(self):
        return TodoRoot()


if __name__ == '__main__':
    TodoApp().run()
</code></pre>

<p>and</p>

<pre><code># todo.kv
#: import main main
#: import ListAdapter kivy.adapters.listadapter.ListAdapter
#: import ListItemButton kivy.uix.listview.ListItemButton

TodoRoot:

&lt;TodoRoot&gt;:
    orientation: "vertical"
    task_input_1: task_input_view_1
    task_input_2: task_input_view_1
    task_list: tasks_list_view

    BoxLayout:
        size_hint_y: None
        height: "40dp"

        TextInput:
            id: task_input_view_1
            size_hint_x: 70
        TextInput:
            id: task_input_view_2
            size_hint_x: 70
        Button:
            text: "Add"
            size_hint_x: 15
            on_press: root.add_task()
        Button:
            text: "Del"
            size_hint_x: 15
            on_press: root.del_task()
    ListView:
        id: tasks_list_view
        adapter:
            ListAdapter(data=[], cls=main.TaskButton)
</code></pre>

<p>that sort of works, but its a bit clunky and I would like to have the text from the two text inputs go into separate columns of the listview but each row can still be selected as a row.</p>