Python + kivy + SQLite: cómo usarlos juntos

Soy nuevo en python, kivy y sqlite. Pero tengo que hacer esta difícil tarea. 🙁 Cualquier tipo de ayuda será muy apreciada. ¡Gracias de antemano!

La tarea es: mostrar los datos de un archivo .db en la pantalla de kivy en Android.

Hice el archivo de la base de datos desde http://zetcode.com/db/sqlitepythontutorial/

Aquí vuelvo a publicar el código.

 #!/usr/bin/python # -*- coding: utf-8 -*- import sqlite3 as lite import sys con = lite.connect('test.db') with con: cur = con.cursor() 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)") 

La base de datos se guarda en C:\\test.db

Luego hice una pantalla kivy con una label y un button .

 # -*- coding: utf-8 -*- from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.lang import Builder import random root_widget = Builder.load_string(''' BoxLayout: orientation: 'vertical' Label: text: 'Hello' #How to define it? font_size: 30 Button: size: root.width/2, 15 text: 'next random' font_size: 30 # on_release: #How to define it? ''') class TestApp(App): def build(self): return root_widget if __name__ == '__main__': TestApp().run() 

Quiero tener un nombre de automóvil random del db file muestra en la label , cuando se hace clic en el button cada vez.

El texto de la label inicial, que ahora es la palabra “Hola”, debe reemplazarse por un nombre de automóvil aleatorio. Para que cada vez que se ejecute el progtwig, se muestre un nombre de automóvil en la label .

Pero realmente no sé cómo escribir el código.

Gracias por tu ayuda.

#Actualizar

Escribí el código pero no funciona.

 # -*- coding: utf-8 -*- from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.lang import Builder from kivy.clock import mainthread import sqlite3 import random class MyBoxLayout(BoxLayout): def init(self, **kwargs): super().__init__(**kwargs) @mainthread # execute within next frame def delayed(): self.load_random_car() delayed() def load_random_car(self): conn = sqlite3.connect("C:\\test.db") cur = conn.cursor() ####Length of db file with conn: cur = conn.cursor() cur.execute("SELECT * FROM Cars") rows = cur.fetchall() LengthSQLFile = len(rows) print LengthSQLFile CurrentNo = random.randint(0, LengthSQLFile) CurrentNo_ForSearch = (CurrentNo ,) cur.execute("select * from Cars where rowid = ?" , CurrentNo_ForSearch) CurrentAll = cur.fetchone() CurrentAll = list(CurrentAll) # Change it from tuple to list print CurrentAll Current = CurrentAll[1] self.ids.label.text = Current #"fetch random car data from db and put here" root_widget = Builder.load_string(''' BoxLayout: orientation: 'vertical' Label: id: label font_size: 30 Button: size: root.width/2, 15 text: 'next random' font_size: 30 on_release: root.load_random_car() ''') class TestApp(App): def build(self): # MyBoxLayout(BoxLayout) return root_widget if __name__ == '__main__': TestApp().run() 

Actualización # 2:

El código ahora es … Muestra el mensaje de error: AttributeError: 'BoxLayout' object has no attribute 'load_random_car'

 # -*- coding: utf-8 -*- from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.lang import Builder from kivy.clock import mainthread import sqlite3 import random class MyBoxLayout(BoxLayout): def init(self, **kwargs): super().__init__(**kwargs) @mainthread # execute within next frame def delayed(): self.load_random_car() delayed() def load_random_car(self): conn = sqlite3.connect("C:\\test.db") cur = conn.cursor() cur.execute("SELECT * FROM Cars ORDER BY RANDOM() LIMIT 1;") currentAll = cur.fetchone() currentAll = list(currentAll) # Change it from tuple to list print currentAll current = currentAll[1] self.ids.label.text = current #"fetch random car data from db and put here" root_widget = Builder.load_string(''' BoxLayout: orientation: 'vertical' Label: id: label font_size: 30 Button: size: root.width/2, 15 text: 'next random' font_size: 30 on_release: root.load_random_car() ''') class TestApp(App): def build(self): # MyBoxLayout(BoxLayout) return root_widget if __name__ == '__main__': TestApp().run() 

La forma más sencilla sería escribir un método de init personalizado para el diseño de la caja:

 from kivy.uix.boxlayout import BoxLayout from kivy.clock import mainthread class MyBoxLayout(BoxLayout): def init(self, **kwargs): super().__init__(**kwargs) @mainthread # execute within next frame def delayed(): self.load_random_car() delayed() def load_random_car(self): self.ids.label.text = "fetch random car data from db and put here" 

Así es como se vería la estructura del widget actualizado:

 MyBoxLayout: Label: id: label Button: on_release: root.load_random_car()