Estoy tratando de hacer algo con el administrador de pantalla en Kivy pero me confundo sobre cómo usarlo: (

Quiero llamar a la función Update() usando Clock.schedule_interval, pero cuando presiono el botón en la parte superior izquierda muestra el error AttributeError: 'NoneType' object has no attribute 'current' creo que es debido al retorno de main: (así que quiero pregunte cómo llamar a una función y devolverla mientras usa el administrador de pantalla :) gracias

.py

kivy.lang.Builder.load_string(
"""
#:kivy 2.0.0

<SettingScreen>:

    Button:
        text: "Go Back"
        on_release:
            root.manager.current = 'main'
            root.manager.transition.direction = 'left'
        
        
<MainScreen>:

    background_color: 0, 0, 0
    
    FloatLayout:

        Button:
            id: go_setting_button
            size_hint: .15, .15
            background_color: root.background_color
            center_y: root.height - self.size[1] /4
            on_release:
                root.manager.current = 'setting'
                root.manager.transition.direction = 'right'
            
            canvas:
                Color:
                    rgb: 0.5, 0.5, 0.5
                Ellipse:
                    pos: self.size[0] /4, self.pos[1]
                    size: self.size[0] /2, self.size[0] /2
                    source: 'setting.jpg'

        Label:
            id: center_label
            text: "Hello World !"
            font_size: 25
            center: root.center
            markup: True
""")

# class SettingScreen ##############################################################################
class SettingScreen(Screen):

    pass


# class MainScreen #################################################################################
class MainScreen(Screen):
    
    def Update(self, dt):
        
        self.ids.center_label.text = "ASDFASDFASD"
        self.ids.center_label.center = self.center
        
####################################################################################################
class MyFirstApp(App):

    def build(self):
        self.title = "My First Kivy App"

        screen_manager = ScreenManager()
        screen_manager.add_widget(MainScreen(name = 'main'))
        screen_manager.add_widget(SettingScreen(name = 'setting'))

        main = MainScreen()
        Clock.schedule_interval(main.Update, 1.0/60.0) #
        
        return screen_manager and main #


if __name__ == "__main__":

    MyFirstApp().run()
-1
Paul Lam 20 ene. 2021 a las 11:26

1 respuesta

La mejor respuesta

El problema es la forma en que estás construyendo tu aplicación. Su código está creando dos instancias de MainScreen, solo una es parte de su GUI. Aquí hay una versión modificada de su método build()

def build(self):
    self.title = "My First Kivy App"

    screen_manager = ScreenManager()
    main = MainScreen(name='main')  # Only make one MainScreen
    screen_manager.add_widget(main)  # add the one MainScreen to the GUI
    # screen_manager.add_widget(MainScreen(name='main'))
    screen_manager.add_widget(SettingScreen(name='setting'))

    # main = MainScreen()  # this creates another instance of MainScreen
    Clock.schedule_interval(main.Update, 1.0 / 60.0)  #

    return screen_manager  # can only return one widget (the root of your GUI)
0
John Anderson 20 ene. 2021 a las 14:35