Изменение свойств виджета kivy в классе

Мне трудно понять, как изменить текст метки в виджете KIVY. Для простоты у меня установлена ​​метка 0, и я хотел бы изменить текст на 30 в этом примере. Однако я получаю следующую ошибку.

AttributeError: у объекта 'super' нет атрибута '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 ответ

Вы делаете пару вещей неправильно здесь. Вы не хотите ставить ScreenManager внутри ScreenТолько один ScreenManager нужно. Тогда вы можете начать Clock в __init__ из Thermostuff(Screen)Или, если вы хотите, чтобы начать 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()
Другие вопросы по тегам