0

みんな、

kivy+Pythonファイルからアイテムを表示するために使用したいdb

この目的のために、以前に質問しました: Python+kivy+SQLite: How to use them together

リンク内のアプリには 1 つの画面が含まれています。それは非常にうまく機能します。

今日はアプリを2画面に変更しました。にはfirst screen特別な要件はありませんが、アプリを に導く必要がありsecond screenます。second screenにはとlabelがありbuttonます。をクリックして、変更buttonしたい。は、上記のリンクにあるファイルlabel textのをlabel text参照しています。car typedb

この 2 つの画面の設計について、2 つの質問があります。

質問 1:がクリックされたlabel textときにを更新する方法を教えてください。button

私は2つの方法で試しました:

方法 A: self.ids.label.text = str(text)
エラー メッセージが表示されますAttributeError: 'super' object has no attribute '__getattr__'

方法 B: self.ids["label"].text = str(text) エラー メッセージが表示 KeyError: 'label'labelれます。

質問 2:を車のタイプの 1 つに設定しlabel origin textて、2 番目の画面が表示されるたびに既に車のタイプが表示されるようにする方法。

コードは次のとおりです: (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()

私はインターネットからたくさん読んだことがありますが、すべてを理解することはできません。:-(

コードを修正するのを手伝ってください。どうもありがとう!

4

1 に答える 1