2017-08-04 3 views
1

Je n'arrive pas à comprendre comment modifier le texte d'une étiquette dans un widget kivy. Pour simplifier, j'ai une étiquette mise à 0 et je voudrais changer le texte pour lire 30 dans cet exemple. Cependant, j'obtiens l'erreur suivante.Modification des propriétés d'un widget kivy dans la classe

AttributeError: objet « super » n'a pas d'attribut « getattr »

Je comprends que je ne suis probablement pas bien cibler ce widget et j'espère que quelqu'un peut-il expliquer comment référencer précisément le texte de cette étiquette (self.ids.mainel1temp.stuff_r.text = « 30 ») mettre à jour (avec plus de détails que de fixer le code)

#!/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() 

Répondre

1

Vous faites quelques mauvaises choses ici. Vous ne voulez pas mettre un ScreenManager à l'intérieur d'un Screen Un seul ScreenManager est nécessaire. Ensuite, vous pouvez démarrer le Clock dans le __init__ du Thermostuff(Screen) ou si vous voulez initier on_enter vous devez passer outre. Dans ce cas, vous pourriez vouloir vérifier d'une manière ou d'une autre, si elle a déjà commencé, ainsi vous n'aurez pas plusieurs horloges en cours d'exécution. Ensuite, lorsque vous créez un ObjectProperty vous n'avez pas besoin de self.ids, parce que vous avez déjà créé cette propriété. Donc self.stuff_r est maintenant l'étiquette.

J'ai réécrit un peu votre exemple, pour le démontrer.
Essayez ceci:

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