2016-12-19 21 views
0

私はPythonでセミオフだが、Kivyにはまったく新しい、私の問題はラベルIDを参照していることを知っているが、それを解決することはできないと思う。私は何が必要です。KivyがPythonでラベルのテキストを変更する

私は現在の時刻を表示するためにラベルを取得しようとしていますので、私は更新などの面で正しいフレームワークを持っていることを知っていますが、私はそのラベルのIDを何とか参照し、私は苦労している?

label_text.textを更新しようとするまで、次のコードはうまく動作し、ラベルなどが表示されます。エラーが発生するのは、AttributeError: 'float' object has no attribute 'lbl_time'です。私はstr(time.strftime("%H:%M:%S"))を試しましたが、それで解決しません。

from kivy.app import App 
from kivy.base import runTouchApp 
from kivy.lang import Builder 
from kivy.properties import ListProperty 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import ObjectProperty 
from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition, FadeTransition 
from kivy.uix.anchorlayout import AnchorLayout 
from kivy.properties import ObjectProperty, StringProperty 
from kivy.clock import Clock 
import time 
from datetime import datetime 

class MainScreen(Screen): 

def update_time(self): 
    lbl_time = ObjectProperty() 
    MyTime = time.strftime("%H:%M:%S") 
    self.lbl_time.text = MyTime 

class DetailScreen(Screen): 
    pass 

class SettingsScreen(Screen): 
    pass 

class MyScreenManager(ScreenManager): 
    pass 



root_widget = Builder.load_string(''' 
    MyScreenManager: 
    MainScreen: 
    DetailScreen: 
    SettingsScreen: 

<MainScreen>: 
    name: 'main' 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      id: lbl_time 
      text: 'Time' 
      font_size: 60 
     Label: 
      text: 'Main2' 
      font_size: 30 
     GridLayout: 
      cols: 2 
      Label: 
       text: 'Bottom' 
       font_size: 30 
      Label: 
       text: 'Bottom1' 
       font_size: 30 

<DetailScreen>: 
    name: 'details' 

<SettingsScreen>: 
    name: 'settings' 

''') 
class ScreenManagerApp(App): 

    def build(self): 
     return root_widget 

    def on_start(self): 
     Clock.schedule_interval(MainScreen.update_time, 1) 

ScreenManagerApp().run() 
+0

変更_update_time_方法:** DEF UPDATE_TIME(自己、*引数):MyTime = time.strftime( "%のH:%のM:%S")自己Iは、以下のコードで上記のすべてを固定しました。 ids ['lbl_time']。text = MyTime ** – Dzmitry

+0

こんにちは、申し訳ありません - >ファイル "MyApp.py"、行20、update_time self.ids ['lbl_time']。テキスト= MyTime AttributeError : 'float'オブジェクトに属性 'ids''がありません – northwarks

+0

彼のメソッド 'Clock.schedule_interval(MainScreen()。update_time、1)'にアクセスするには* MainScreen()*を呼び出す必要があります – Dzmitry

答えて

0

これはKivyの問題ではなく、Pythonの問題です。 MainScreenのオブジェクト/インスタンスではなく、クラスMainScreenクラスのupdate_timeを呼び出していました。基本的には、buildメソッドのオブジェクト(self.main_screen)への参照を保存し、それをon_startで使用する必要があります。

class ScreenManagerApp(App): 

    def build(self): 
     self.main_screen = MainScreen() 
     return self.main_screen 

    def on_start(self): 
     Clock.schedule_interval(self.main_screen.update_time, 1) 

また、kv言語外のid、つまりPythonではアクセスできません。 idを参照するには、プロパティを追加する必要があります(例: the_time

<MainScreen>: 
    name: 'main' 
    the_time: _id_lbl_time 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      id: _id_lbl_time 

マイナーな問題はupdate_time()パラメータに受信することです。また、あなたのコードには奇妙なことがいくつかあったので、コードを実行することができませんでした。

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import Screen 
from kivy.properties import ObjectProperty, StringProperty 
from kivy.clock import Clock 
import time 
from datetime import datetime 

Builder.load_string(''' 
<MainScreen>: 
    name: 'main' 
    the_time: _id_lbl_time 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      id: _id_lbl_time 
      text: 'Time' 
      font_size: 60 
''') 

class MainScreen(Screen): 

    def update_time(self, sec): 
     MyTime = time.strftime("%H:%M:%S") 
     self.the_time.text = MyTime 


class ScreenManagerApp(App): 

    def build(self): 
     self.main_screen = MainScreen() 
     return self.main_screen 

    def on_start(self): 
     Clock.schedule_interval(self.main_screen.update_time, 1) 

ScreenManagerApp().run() 
+1

Hey - すべて動いています - ありがとう - あなたが参照する奇妙なことは、ビルドし始めたスクリーンマネージャーコードの概要ですそれはコードの実行に影響するようには見えなかったので、ラベルを更新するまで並べ替えることができました。 – northwarks

関連する問題