Python+kivy+SQLite: 如何设置标签初始值以及如何更新标签文本?
Python+kivy+SQLite: How to set label initial value and how to update label text?
各位,
我想使用 kivy+Python
显示 db
文件中的项目。
为此我之前问过一个问题:
link中的应用包含一个屏幕。它工作得很好。
今天我把App改成了两个屏。 first screen
没有什么特殊要求,就是要把App引到second screen
。在second screen
中有一个label
和一个button
。通过单击 button
,我想更改 label text
。 label text
指的是我在上面 link 中的 db
文件中的 car type
。
对于这两个屏幕的设计,我有两个问题:
问题1:点击button
时如何更新label text
?
我尝试了两种方法:
方法一: self.ids.label.text = str(text)
它向我显示了错误消息:AttributeError: 'super' object has no attribute '__getattr__'
我用谷歌搜索了很多但仍然无法理解。
方法B: self.ids["label"].text = str(text)
它向我显示错误消息:KeyError: 'label'
我很困惑,因为我定义了 label
。
问题2:如何将label origin text
设置为其中一种车型,使得每次显示第二屏时,已经显示了一种车型.
代码如下:(db file
请参考上面的link)
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle
from kivy.properties import NumericProperty, StringProperty, BooleanProperty, ListProperty
from kivy.base import runTouchApp
from kivy.clock import mainthread
import sqlite3
import random
class MyScreenManager(ScreenManager):
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()
conn.close()
currentAll = list(currentAll) # Change it from tuple to list
print currentAll
current = currentAll[1]
print current
self.ids.label.text = str(current) # Method A
# self.ids["label"].text = str(current) # Method B
class FirstScreen(Screen):
pass
class SecondScreen(Screen):
pass
root_widget = Builder.load_string('''
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
MyScreenManager:
transition: FadeTransition()
FirstScreen:
SecondScreen:
<FirstScreen>:
name: 'first'
BoxLayout:
orientation: 'vertical'
Label:
text: "First Screen"
font_size: 30
Button:
text: 'Go to 2nd Screen'
font_size: 30
on_release: app.root.current = 'second'
<SecondScreen>:
name: 'second'
BoxLayout:
orientation: 'vertical'
Label:
id: label
text: 'click to get a new car' # I want its text changed when the button is clicked everytime. And its original text value should be one of the random car type from the db file.
font_size: 30
Button:
text: 'Click to get a random car'
font_size: 30
on_release: app.root.load_random_car()
''')
class ScreenManager(App):
def build(self):
return root_widget
if __name__ == '__main__':
ScreenManager().run()
我在网上看了很多,但我不能全部看懂。 :-(
请帮我更正代码。非常感谢!
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.widget import Widget
Builder.load_string("""
<ScreenX>
BoxLayout:
orientation: 'vertical'
Label:
text: root.label_text
Button:
text: 'Click Me'
on_release: root.on_clicked_button()
""")
class ScreenX(Widget):
label_text = StringProperty("Default Value")
def on_clicked_button(self):
self.label_text = "New Text!"
class MyApp(App):
def build(self):
return ScreenX()
MyApp().run()
您通常会这样做...
各位,
我想使用 kivy+Python
显示 db
文件中的项目。
为此我之前问过一个问题:
link中的应用包含一个屏幕。它工作得很好。
今天我把App改成了两个屏。 first screen
没有什么特殊要求,就是要把App引到second screen
。在second screen
中有一个label
和一个button
。通过单击 button
,我想更改 label text
。 label text
指的是我在上面 link 中的 db
文件中的 car type
。
对于这两个屏幕的设计,我有两个问题:
问题1:点击button
时如何更新label text
?
我尝试了两种方法:
方法一: self.ids.label.text = str(text)
它向我显示了错误消息:AttributeError: 'super' object has no attribute '__getattr__'
我用谷歌搜索了很多但仍然无法理解。
方法B: self.ids["label"].text = str(text)
它向我显示错误消息:KeyError: 'label'
我很困惑,因为我定义了 label
。
问题2:如何将label origin text
设置为其中一种车型,使得每次显示第二屏时,已经显示了一种车型.
代码如下:(db file
请参考上面的link)
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle
from kivy.properties import NumericProperty, StringProperty, BooleanProperty, ListProperty
from kivy.base import runTouchApp
from kivy.clock import mainthread
import sqlite3
import random
class MyScreenManager(ScreenManager):
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()
conn.close()
currentAll = list(currentAll) # Change it from tuple to list
print currentAll
current = currentAll[1]
print current
self.ids.label.text = str(current) # Method A
# self.ids["label"].text = str(current) # Method B
class FirstScreen(Screen):
pass
class SecondScreen(Screen):
pass
root_widget = Builder.load_string('''
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
MyScreenManager:
transition: FadeTransition()
FirstScreen:
SecondScreen:
<FirstScreen>:
name: 'first'
BoxLayout:
orientation: 'vertical'
Label:
text: "First Screen"
font_size: 30
Button:
text: 'Go to 2nd Screen'
font_size: 30
on_release: app.root.current = 'second'
<SecondScreen>:
name: 'second'
BoxLayout:
orientation: 'vertical'
Label:
id: label
text: 'click to get a new car' # I want its text changed when the button is clicked everytime. And its original text value should be one of the random car type from the db file.
font_size: 30
Button:
text: 'Click to get a random car'
font_size: 30
on_release: app.root.load_random_car()
''')
class ScreenManager(App):
def build(self):
return root_widget
if __name__ == '__main__':
ScreenManager().run()
我在网上看了很多,但我不能全部看懂。 :-(
请帮我更正代码。非常感谢!
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.widget import Widget
Builder.load_string("""
<ScreenX>
BoxLayout:
orientation: 'vertical'
Label:
text: root.label_text
Button:
text: 'Click Me'
on_release: root.on_clicked_button()
""")
class ScreenX(Widget):
label_text = StringProperty("Default Value")
def on_clicked_button(self):
self.label_text = "New Text!"
class MyApp(App):
def build(self):
return ScreenX()
MyApp().run()
您通常会这样做...