2016-08-18 18 views
0

みんな、Python + kivy + SQLite:ラベル初期値の設定方法とラベルテキストの更新方法は?

dbのアイテムを表示するには、kivy+Pythonを使用します。

この目的のために、私は前に質問をしていますPython+kivy+SQLite: How to use them together

リンク内のAppは、一つの画面が含まれています。それはとてもうまくいく。

今日私はに2つののスクリーンにアプリケーションを変更しました。 first screenには、アプリケーションをsecond screenに導く特別な要件はありません。 second screenには、labelbuttonがあります。 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() 

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

コードを修正するために私を助けてください。ありがとうございました!

答えて

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

することは、あなたがこれを行うだろうか、一般的である...

+0

すばらしい!ありがとうございました! – Rita

関連する問題