Ошибка при динамическом добавлении кнопок на экран в ScreenManager Kivy

#python #kivy

#питон #kivy

Вопрос:

Я пытаюсь динамически добавлять кнопки на экран. При запуске приложения у меня возникает следующая ошибка. Пожалуйста, помогите мне решить проблему.

Трассировка (последний последний вызов): Файл «main.py «, строка 174, в файле ScreenManager.add_widget(рабочий стол (имя = ‘Рабочий стол’ ) ) «main.py «, строка 162, в файле init self.add_widget(btn) «/Applications/Kivy.app/Contents/Resources/kivy/kivy/uix/floatlayout.py «, строка 111, в add_widget pos=self._trigger_layout, ошибка атрибута: объект ‘HomeScreen’ не имеет атрибута ‘_trigger_layout’

Вот мой main.py

 class HomeScreen(Screen):

    def __init__(self, **kwargs):
        for i in range(80):
            btn = Button(text=str(i), size=(90, 90), size_hint=(None, None))
            self.add_widget(btn)


# Screen Manager
screenManager = ScreenManager( transition = FadeTransition() )

# Add all screens to screen manager
#screenManager.add_widget( UsernameScreen( name = 'usernameScreen' ) )
#screenManager.add_widget( PasswordScreen( name = 'passwordScreen' ) )
#screenManager.add_widget( LevelTwoScreen( name = 'levelTwoScreen' ) )
#screenManager.add_widget( LevelTwoScreen( name = 'levelThreeScreen' ) )

screenManager.add_widget( HomeScreen( name = 'homeScreen' ) )

class ThreeLevelAuthApp(App):
    def build(self):
        return screenManager

if __name__ == '__main__':
    ThreeLevelAuthApp().run()
 

файл kivy

 <HomeScreen>:
    ScrollView:
        size_hint: None, None
        size: 400, 400
        pos_hint: { 'center_x': 0.5,'center_y': 0.5 }   
        do_scroll_x: False

    GridLayout:
        cols: 6
        padding: 20
        spacing: 20
        size_hint: None, None
        width: 400
 

Ответ №1:

Давайте начнем с __init__ :

 class HomeScreen(Screen):

    def __init__(self, **kwargs):
        for i in range(80):
            btn = Button(text=str(i), size=(90, 90), size_hint=(None, None))
            self.add_widget(btn)
 

хотя это выглядит нормально и вызывается при создании экземпляра, не хватает одной основной вещи — super() . Вам необходимо super() инициализировать Screen первый, чтобы у него были все необходимые переменные и методы, которые делают его классом с реальным поведением и, следовательно, позволяют вам фактически наследовать поведение.

Обратите внимание, что Screen сам по себе является a RelativeLayout , и вам нужно будет обрабатывать дополнительные вещи, такие как позиционирование и / или размер, если вы не будете использовать макет, который делает это за вас.

 import random
class HomeScreen(Screen):

    def __init__(self, **kwargs):
        super(HomeScreen, self).__init__(**kwargs)
        for i in range(80):
            btn = Button(text=str(i), size=(90, 90),
                         size_hint=(None, None),
                         pos=[random.randint(0,500), random.randint(0,500)])
            self.add_widget(btn)
 

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

1. О, я допустил глупую ошибку. В любом случае спасибо. Теперь он работает нормально.