Rit*_*ita 6 python sqlite kivy
我是 python、kivy 和 sqlite 的新手。但我必须完成这项艰巨的任务。:-( 任何形式的帮助将不胜感激。提前致谢!
任务是:在android.db的kivy屏幕上显示来自文件的数据。
我从http://zetcode.com/db/sqlitepythontutorial/创建了数据库文件
这里我再次贴出代码。
#!/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)")
Run Code Online (Sandbox Code Playgroud)
然后将数据库保存到C:\\test.db.
然后我kivy用 alabel和 a做了一个屏幕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()
Run Code Online (Sandbox Code Playgroud)
我想要从 上显示的random 汽车名称,每次单击时。db filelabelbutton
最初的label文本,现在是“你好”这个词,应该替换为一个随机的汽车名称。这样每次程序运行时,汽车名称都会显示在label.
但是我真的不知道如何编写代码。
感谢您的帮助。
#更新
我写了代码,但它不起作用。
# -*- 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()
Run Code Online (Sandbox Code Playgroud)
#2 更新:
现在的代码是......它显示了错误消息: 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()
Run Code Online (Sandbox Code Playgroud)
最简单的方法是init为框布局编写自定义方法:
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"
Run Code Online (Sandbox Code Playgroud)
这是更新后的小部件结构的样子:
MyBoxLayout:
Label:
id: label
Button:
on_release: root.load_random_car()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9318 次 |
| 最近记录: |