Изменение свойств виджета 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()