问题描述
我是python,kivy和sqlite的新手.但是我必须完成这项艰巨的任务. :-(任何帮助将不胜感激.预先感谢!
任务是:在android的kivy
屏幕上显示.db
文件中的数据.
我从 http://zetcode.com/db/sqlitepythontutorial/制作了数据库文件/p>
在这里,我再次发布代码.
#!/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)")
然后将数据库保存到C:\\test.db
.
然后我创建了一个kivy
屏幕,其中包含label
和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()
每次单击button
时,我想从label
上显示的db file
中获得random
汽车名称.
最初的label
文本(现在为"Hello")应替换为随机的汽车名称.这样,每次运行程序时,label
上都会显示汽车名称.
但是我真的不知道如何编写代码.
感谢您的帮助.
#Update
我写了代码,但是没有用.
# -*- 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()
#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()
最简单的方法是为框布局编写自定义的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"
这是更新后的窗口小部件结构的样子:
MyBoxLayout:
Label:
id: label
Button:
on_release: root.load_random_car()
I am new to python, kivy and sqlite. But I have to do this difficult task. :-( Any kind of help will be highly appreciated. Thanks in advance!
The task is: to display the data from a .db
file on the kivy
screen on android.
I made the database file from http://zetcode.com/db/sqlitepythontutorial/
Here I post the code again.
#!/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)")
The database is then saved to C:\\test.db
.
Then I made a kivy
screen with a label
and 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()
I want to have a random
car name from the db file
shown on the label
, when the button
is clicked everytime.
The initial label
text, which is now the word "Hello", should be replaced by a random car name. So that everytime the programm is run, a car name is shown on the label
.
But I really dont know how to write the code.
Thank you for your help.
#Update
I wrote the code but it does not work.
# -*- 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()
#2 Update:
The code now is... It shows the error message: 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()
The easiest way would be writing a custom init
method for the box layout:
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"
This is how the updated widget structure would look like:
MyBoxLayout:
Label:
id: label
Button:
on_release: root.load_random_car()
这篇关于Python + kivy + SQLite:如何一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!