2017-08-04 20 views
1

kivyウィジェット内のラベルのテキストを変更する方法がわかりません。簡単にするために、ラベルを0に設定しています。この例では、テキストを30に変更したいと考えています。しかし、私は次のエラーが発生します。クラス内のkivyウィジェットのプロパティを変更する

はAttributeError:「スーパー」オブジェクトが属性「GETATTR

を持っていない私は、私はおそらく適切にそのウィジェットをターゲットにないことだし、私は誰かが特にこのテキストを参照する方法を説明してくださいすることができます期待していますということを理解しますラベル(self.ids.mainel1temp.stuff_r.text =「30」)(コードを固定よりも詳細で)更新する

#!/usr/bin/kivy 
import kivy 


from random import random 
from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.uix.switch import Switch 
from kivy.uix.label import Label 

from kivy.config import Config 
Config.set('graphics', 'width', '800') 
Config.set('graphics', 'height', '480') 

Builder.load_string(""" 

<Menuscreen>: 
    #Handling the gesture event. 
    ScreenManager: 
     id: manager 
     Screen: 
      id: main_screen 
      name:'main_screen' 
      stuff_r: mainel1temp 
      FloatLayout: 

       Label: 
        id: mainel1temp 
        size: self.texture_size 
        text:'0' 
        size_hint: None, None 
        text_size: 75,75 
        pos: 295,308 
        font_size:'20sp' 
        halign: 'center' 



""") 

class Thermostuff(Screen): 
    stuff_r = ObjectProperty(None) 

    def starttherm(self): 
     Clock.schedule_interval((self.read_temp), 1) 

    def read_temp(self, dt): 
     self.ids.mainel1temp.stuff_r.text = '30' 


Thermrun = Thermostuff() 
Thermrun.starttherm() 

class MenuScreen(Screen): 
    pass 

sm = ScreenManager() 
menu_screen = MenuScreen(name='menu') 
sm.add_widget(menu_screen) 


class TestApp(App): 

    def build(self): 

     return sm 

if __name__ == '__main__': 
    TestApp().run() 

答えて

1

あなたはここで間違って物事のカップルを行います。 ScreenManagerScreen に入れないでください。ScreenManagerの1つだけが必要です。 Thermostuff(Screen)__init__Clockを開始するか、on_enterを開始するには、それを上書きする必要があります。そのような場合には、何らかの点検が必要な場合があります。その場合は、すでに起動しているので、複数のクロックを実行する必要はありません。 ObjectPropertyを作成すると、そのプロパティが既に作成されているため、self.idsは必要ありません。だからself.stuff_rがラベルになりました。

例を少し書き直して、これを実証しました。
試用:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import Screen 
from kivy.properties import ObjectProperty 
from kivy.clock import Clock 

sm = """ 


#Handling the gesture event. 
ScreenManager: 
    id: manager 
    MenuScreen: 
     Button: 
      text: "Go to Thermostuff" 
      on_release: 
       root.current = "main_screen" 
    Thermostuff: 
     name:'main_screen' 
     stuff_r: mainel1temp 
     FloatLayout: 

      Label: 
       id: mainel1temp 
       size: self.texture_size 
       text:'0' 
       size_hint: None, None 
       text_size: 75,75 
       pos: 295,308 
       font_size:'20sp' 
       halign: 'center' 



""" 

class Thermostuff(Screen): 
    stuff_r = ObjectProperty(None) 
    test_temp = 0 

    def __init__(self,**kwargs): 
     super(Thermostuff,self).__init__(**kwargs) 
     Clock.schedule_interval((self.read_temp), 1) 

    def read_temp(self, dt): 
     self.test_temp += 1 
     self.stuff_r.text = str(self.test_temp) 


class MenuScreen(Screen): 
    pass 


class TestApp(App): 

    def build(self): 

     return Builder.load_string(sm) 

if __name__ == '__main__': 
    TestApp().run() 
関連する問題