Проблемы с ScreenManager и Screen в Python (кивы). Я хочу позвонить по определению в Screen из класса Screenmanager - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь вызвать def в классе Screen из Screenmanager из класса Screenmanager, но не могу.

Я хочу создать макет блока и поместить кнопку в этот блок бокса при запуске приложения. как только вызывается ScreenManager, он становится экраном по умолчанию. Я хочу сделать это, чтобы я мог переключаться между несколькими экранами с помощью self.parent.current = 'Screen Name' при нажатии кнопки

Вот код

class Manager(ScreenManager):
    def __init__(self):
        self.add_widget(Scr1().make_button())
class Scr1(Screen):
    def __init__(self):
        self.layout = BoxLayout(orientation = 'vertical')
        self.button = Button(text='hello')
        self.layout.add_widget(self.button)
    def make_button(self, layout):
        return self.layout



class MainApp(App):
    def build(self):
        sm =Manager()
        s1 = Scr1()
        sm.add_widget=s1
        return sm

if __name__ == "__main__":
    MainApp().run()

Здесьэто ошибка, которую я получаю


 Traceback (most recent call last):
   File "C:/Users/user/Desktop/CarsonMusic/Learn.py", line 43, in <module>
     MainApp().run()
   File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kivy\app.py", line 829, in run
     root = self.build()
   File "C:/Users/user/Desktop/CarsonMusic/Learn.py", line 37, in build
     sm =Manager()
   File "C:/Users/user/Desktop/CarsonMusic/Learn.py", line 24, in __init__
     self.add_widget(Scr1().make_button())
   File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kivy\uix\screenmanager.py", line 979, in add_widget
     'ScreenManager accepts only Screen widget.')
 kivy.uix.screenmanager.ScreenManagerException: ScreenManager accepts only Screen widget.

Я знаю, что, вероятно, совершаю глупую ошибку, но может ли кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 08 ноября 2019

Я решил это! Мне пришлось удалить класс Manager (ScreenManager), добавить «super», а затем я добавил виджет макета в self

Вот мой новый код:

class Scr1(Screen):
    def __init__(self, **kwargs):
        super (Scr1, self).__init__(**kwargs)

        self.layout = BoxLayout(orientation='vertical')
        self.button = Button(text='hello')
        self.button.bind(on_press=self.screen2)
        self.layout.add_widget(self.button)
        self.add_widget(self.layout)

    def screen2(self, *args):
        self.manager.current = 'screen2'

class Scr2(Screen):

    def __init__(self, **kwargs):
        super (Scr2,self).__init__(**kwargs)

        self.layout2 = BoxLayout(orientation='vertical')
        self.add_widget(self.layout2)
        self.button2 = Button(text='hello2')
        self.button2.bind(on_press=self.screen1)
        self.layout2.add_widget(self.button2)
    def screen1(self, *args):
        self.manager.current = 'screen1'

class MainApp(App):
    def build(self):
        sm= ScreenManager()
        screen1 = Scr1(name='screen1')
        screen2= Scr2(name='screen2')
        sm.add_widget(screen1)
        sm.add_widget(screen2)
        return sm

if __name__ == "__main__":
    MainApp().run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...