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

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

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

person fastmhc    schedule 04.08.2017    source источник


Ответы (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()
person el3ien    schedule 04.08.2017