Python + kivy + SQLite:如何设置标签初始值以及如何更新标签文本?

时间:2016-08-18 18:38:45

标签: android python kivy kivy-language

大家,

我想使用kivy+Python来显示db文件中的项目。

为此,我之前提出了一个问题:Python+kivy+SQLite: How to use them together

链接中的应用程序包含一个屏幕。它工作得很好。

今天我已将应用更改为两个屏幕。 first screen没有特殊要求,只能引导应用到second screen。在second screen中有一个label和一个button。点击button我希望更改label textlabel text引用了我在上面链接中的car type文件中的db

对于这两个屏幕设计,我有两个问题:

问题1 :点击label text时如何更新button

我尝试了两种方法:

方法A: self.ids.label.text = str(text)
它向我显示了错误消息:AttributeError: 'super' object has no attribute '__getattr__'我已经google了很多但仍然无法理解。

方法B: self.ids["label"].text = str(text) 它向我显示错误消息:KeyError: 'label'我感到困惑,因为我已经定义了label

问题2:如何将label origin text设置为其中一种车型,以便每次显示第二个屏幕时,都会显示车型。

以下是代码:(对于db file,请参阅上面的链接。)

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

我从互联网上读了很多,但我无法理解它们。 :-(

请帮我纠正代码。非常感谢你!

1 个答案:

答案 0 :(得分:1)

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

通常是你如何做到的......