みんな、Python + kivy + SQLite:ラベル初期値の設定方法とラベルテキストの更新方法は?
db
のアイテムを表示するには、kivy+Python
を使用します。
この目的のために、私は前に質問をしていますPython+kivy+SQLite: How to use them together
リンク内のAppは、一つの画面が含まれています。それはとてもうまくいく。
今日私はに2つののスクリーンにアプリケーションを変更しました。 first screen
には、アプリケーションをsecond screen
に導く特別な要件はありません。 second screen
には、label
とbutton
があります。 button
をクリックすると、label text
が変更されます。 label text
は、上記のリンクにあるdb
ファイルのcar type
を指します。
質問1:button
がクリックされたときにがどのようにlabel text
を更新するには、この二つの画面のデザインについては
、私は2つの質問がありますか?
私は二つの方法で試してみました:AttributeError: 'super' object has no attribute '__getattr__'
私は多くのことをGoogleで検索しているが、まだ理解できない:それは私にエラーメッセージが表示さself.ids.label.text = str(text)
:
方法A。
方法B:KeyError: 'label'
私はlabel
を定義したので、私は混乱しています:self.ids["label"].text = str(text)
それは私にエラーメッセージが表示されます。
は質問2:毎回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()
私は、インターネットから多くのことを読んだが、私はそれらすべてを理解することはできません。 :-(
コードを修正するために私を助けてください。ありがとうございました!
すばらしい!ありがとうございました! – Rita