【问题标题】:Changing kivy widget properties within Class在 Class 中更改 kivy 小部件属性
【发布时间】:2018-01-12 15:06:45
【问题描述】:

我很难弄清楚如何在 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()

【问题讨论】:

    标签: python properties widget kivy getattr


    【解决方案1】:

    你在这里做错了几件事。 你不想把ScreenManager 放在Screen 里面 只需要一个ScreenManager。 然后就可以在Thermostuff(Screen)__init__中启动Clock 或者,如果您希望它启动 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多