Как вызвать функцию в экранном менеджере kivy? [ закрыто ]

#python #function #kivy

#python #функция #kivy

Вопрос:

Я пытаюсь выполнить sth с помощью диспетчера экранов в Kivy, но я запутался в том, как его использовать: (

я хочу вызвать функцию Update() с помощью Clock.schedule_interval , но когда я нажимаю кнопку вверху слева, она показывает ошибку AttributeError: 'NoneType' object has no attribute 'current' , я думаю, это из-за main возврата: (поэтому хочу спросить, как вызвать функцию и вернуть ее при использовании диспетчера экранов : ) спасибо

.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:

Проблема в том, как вы создаете свое приложение. Ваш код создает два экземпляра MainScreen , только один является частью вашего графического интерфейса. Вот модифицированная версия вашего 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)
 

Комментарии:

1. oic ~ спасибо, что ответили мне : ) теперь я понял 🙂