Python + kivy + SQLite:如何设置标签初始值以及如何更新标签文本? [英] Python+kivy+SQLite: How to set label initial value and how to update label text?

查看:90
本文介绍了Python + kivy + SQLite:如何设置标签初始值以及如何更新标签文本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所有人

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

I want to use kivy+Python to display items from a db file.

为此,我之前曾问过一个问题: Python + kivy + SQLite:如何一起使用

To this purpose I have asked a question before: Python+kivy+SQLite: How to use them together

链接中的应用包含一个屏幕.效果很好.

The App in the link contains one screen. It works very well.

今天,我已将应用程序更改为两个屏幕. first screen没有特殊要求,但可以将应用程序引向second screen.在second screen中有一个labelbutton.通过单击button,我想要更改label text. label text是指我在上面的链接中具有的db文件中的car type.

Today I have changed the App to two screens. The first screen has no special requirement but to lead the App to the second screen. In the second screen there is a label and a button. By clicking the button I want to have the label text changed. The label text refers to the car type from the db file that I have in the link above.

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

For this two screens design, I have two questions:

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

Question 1: How to update the label text when the button is clicked?

我尝试了两种方法:

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

Method A: self.ids.label.text = str(text)
It shows me the error message: AttributeError: 'super' object has no attribute '__getattr__' I have googled a lot but still cannot understand.

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

Method B: self.ids["label"].text = str(text) It shows me the error message: KeyError: 'label' I am confused because I have the label defined.

问题2:如何将label origin text设置为一种汽车类型,以便每次显示第二个屏幕时,已经显示了一种汽车类型.

Question 2: How to set the label origin text to one of the car type, so that everytime the second screen is shown, there is already a car type shown.

以下是代码:(有关db file的信息,请参阅上面的链接.)

Here is the code: (For the db file please refer to the link above.)

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

我从互联网上读了很多书,但我听不懂. :-(

I have read a lot from internet, but I cannot understand them all. :-(

请帮助我更正代码.非常感谢!

Please help me to correct the code. Thank you so much!

推荐答案

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

通常是您的操作方式...

is typically how you would do this ...

这篇关于Python + kivy + SQLite:如何设置标签初始值以及如何更新标签文本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆