2017-08-04 3 views
1

Ich habe Schwierigkeiten, herauszufinden, wie man den Text eines Etiketts in einem kivy-Widget ändert. Der Einfachheit halber habe ich eine Beschriftung auf 0 gesetzt und möchte in diesem Beispiel den Text auf 30 ändern. Ich erhalte jedoch den folgenden Fehler.Ändern der Kivy-Widget-Eigenschaften innerhalb der Klasse

Attribute: ‚super‘ Objekt hat kein Attribut ‚getattr

Ich verstehe, dass ich wahrscheinlich nicht richtig, dass die Widget-Targeting und ich bin der Hoffnung, jemand erklären, bitte kann, wie gesagt, den Text dieses verweisen Etikett (self.ids.mainel1temp.stuff_r.text = ‚30‘) zu aktualisieren (mit mehr Details als den Code Fixierung)

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

Antwort

1

Sie tun ein paar Dinge falsch hier. Sie möchten keine ScreenManager innerhalb eines Screen setzen Nur ein ScreenManager wird benötigt. Dann können Sie die Clock in der __init__ der Thermostuff(Screen) starten, oder wenn Sie möchten, dass on_enter initiieren, müssen Sie dies überschreiben. In diesem Fall möchten Sie vielleicht überprüfen, ob es bereits gestartet ist, so dass Sie nicht mehrere Uhren laufen haben. Dann, wenn Sie ein ObjectProperty erstellen, brauchen Sie nicht self.ids, weil Sie bereits diese Eigenschaft erstellt haben. Also self.stuff_r ist jetzt das Etikett.

Ich habe Ihr Beispiel ein bisschen umgeschrieben, um dies zu demonstrieren.
Versuchen Sie Folgendes:

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