#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. О, я допустил глупую ошибку. В любом случае спасибо. Теперь он работает нормально.