C.Yu
C.Yu

Reputation: 21

Dynamic table display using kivy and sqlite 3

I am working on a GUI to manage inventory (Python 3.4, Sqlite3 and Kivy 1.9.1) and the idea is to be able to recognize products based on their different features, which are listed in a database.

Is there a way to display a sqlite table using kivy ? I think a ListView could be the solution but I am really struggling to understand how to make a CustomListItem with the right args_converter to get several columns with different labels in them.

Upvotes: 2

Views: 5752

Answers (2)

satyakam shashwat
satyakam shashwat

Reputation: 80

Slightly modifying the original solution from @el3ien for better look and feel :-

import sqlite3 as lite

con = lite.connect('test.db')
cur = con.cursor()

try:
    with con:
        cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT)")
        cur.execute("INSERT INTO Cars VALUES(1,'Audi',52642)")
        cur.execute("INSERT INTO Cars VALUES(2,'Mercedes',57127)")
        cur.execute("INSERT INTO Cars VALUES(3,'Skoda',9000)")
        cur.execute("INSERT INTO Cars VALUES(4,'Volvo',29000)")
        cur.execute("INSERT INTO Cars VALUES(5,'Bentley',350000)")
        cur.execute("INSERT INTO Cars VALUES(6,'Citroen',21000)")
        cur.execute("INSERT INTO Cars VALUES(7,'Hummer',41400)")
        cur.execute("INSERT INTO Cars VALUES(8,'Volkswagen',21600)")
except:
    pass


from kivy.uix.boxlayout import BoxLayout
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty


Builder.load_string("""

<MyLayout>:
    orientation: "vertical"
    BoxLayout:
        size_hint_y: 0.1
        Label:
            text: 'ID'
        Label:
            text: 'Brand'
        Label:
            text: 'Km'
    BoxLayout:
        RecycleView:
            data: [{'text':"{}".format(id)} for id,name,km in root.rows]
            viewclass: "Label"
            RecycleBoxLayout:
                default_size: None, dp(56)
                default_size_hint: 1, None
                size_hint_y: None
                height: self.minimum_height
                orientation: "vertical"
        RecycleView:
            data: [{'text':"{}".format(name)} for id,name,km in root.rows]
            viewclass: "Label"
            RecycleBoxLayout:
                default_size: None, dp(56)
                orientation: "vertical"
                default_size_hint: 1, None
                size_hint_y: None
                height: self.minimum_height
        RecycleView:
            data: [{'text':"{}".format(km)} for id,name,km in root.rows]
            viewclass: "Label"
            RecycleBoxLayout:
                default_size: None, dp(56)
                orientation: "vertical"
                default_size_hint: 1, None
                size_hint_y: None
                height: self.minimum_height
    Button:
        size_hint_y: 0.1
        text: "Get data"
        on_press: root.get_data()

""")


class MyLayout(BoxLayout):
    rows = ListProperty([("Id","Brand","Km Run")])
    def get_data(self):
        cur.execute("SELECT * FROM Cars")
        self.rows = cur.fetchall()
        print(self.rows)


runTouchApp(MyLayout())

Upvotes: 1

el3ien
el3ien

Reputation: 5405

Yes, you can use RecycleView for this.
Try this example:

import sqlite3 as lite

con = lite.connect('test.db')
cur = con.cursor()

try:
    with con:
        cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT)")
        cur.execute("INSERT INTO Cars VALUES(1,'Audi',52642)")
        cur.execute("INSERT INTO Cars VALUES(2,'Mercedes',57127)")
        cur.execute("INSERT INTO Cars VALUES(3,'Skoda',9000)")
        cur.execute("INSERT INTO Cars VALUES(4,'Volvo',29000)")
        cur.execute("INSERT INTO Cars VALUES(5,'Bentley',350000)")
        cur.execute("INSERT INTO Cars VALUES(6,'Citroen',21000)")
        cur.execute("INSERT INTO Cars VALUES(7,'Hummer',41400)")
        cur.execute("INSERT INTO Cars VALUES(8,'Volkswagen',21600)")
except:
    pass


from kivy.uix.boxlayout import BoxLayout
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty


Builder.load_string("""

<MyLayout>:
    Button:
        text: "Get data"
        on_press: root.get_data()
    RecycleView:
        data: [{'text':"Id:{} Brand:{} Km:{}".format(id,name,km)} for id,name,km in root.rows]
        viewclass: "Label"
        RecycleBoxLayout:
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'vertical'

""")


class MyLayout(BoxLayout):
    rows = ListProperty([("Id","Brand","Price")])
    def get_data(self):
        cur.execute("SELECT * FROM Cars")
        self.rows = cur.fetchall()
        print(self.rows)


runTouchApp(MyLayout())

Upvotes: 6

Related Questions