みんな、
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 type
db
この 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()
私はインターネットからたくさん読んだことがありますが、すべてを理解することはできません。:-(
コードを修正するのを手伝ってください。どうもありがとう!