使用 kivy 和 sqlite 3 的动态表格显示

2022-01-15 00:00:00 python kivy listview sqlite

我正在开发一个 GUI 来管理库存(Python 3.4、Sqlite3 和 Kivy 1.9.1),我的想法是能够根据产品的不同特征识别产品,这些特征在一个数据库.

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.

有没有办法使用 kivy 显示 sqlite 表?我认为 ListView 可能是解决方案,但我真的很难理解如何使用正确的 args_converter 制作一个 CustomListItem 以获得几列不同的标签.

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.

推荐答案

是的,您可以为此使用 RecycleView.
试试这个例子:

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())

相关文章