Kivy: 'Carousel.remove_widget ()' вызывает IndexError - PullRequest
1 голос
/ 20 марта 2020

'Carousel.remove_widget ()' вызывает IndexError, когда активен последний слайд, и ошибка не доставляется пользователю. Как мне пройти мимо индекса Исключение ошибок.

Когда в коде вызывается remove_widget () или clear_widgets (), выдает и индекс ошибки. Как мне обойти ошибку индекса.

вот код

from kivy.app import App
from kivy.factory import Factory
from kivy.clock import Clock
import random


N_SLIDES = random.choice(range(2, 4))  # Has to be 2 or greater

class SampleApp(App):
    def build(self):
        c = Factory.Carousel()
        for i in range(N_SLIDES):
            c.add_widget(Factory.Label(text=str(i), font_size=100))
        c.index = N_SLIDES - 1  # switch to the last slide
        return c

    def on_start(self):
        c = self.root
        Clock.schedule_once(
            lambda __: c.remove_widget(random.choice(c.slides)),  # remove any slide
            c.anim_move_duration + 1)


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

вот ошибка

Traceback (most recent call last):
   File "kivy/properties.pyx", line 599, in kivy.properties.Property.dispatch
     ps.observers.dispatch(obj, ps.value, None, None, 0)
   File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
     result = self._dispatch(
   File "kivy/_event.pyx", line 1120, in kivy._event.EventObservers._dispatch
     return f(obj, value)
   File "kivy/properties.pyx", line 1503, in kivy.properties.AliasProperty.trigger_change
     cpdef trigger_change(self, EventDispatcher obj, value):
   File "kivy/properties.pyx", line 1505, in kivy.properties.AliasProperty.trigger_change
     dvalue = ps.getter(obj)
   File "/tmp/firefox/kivy/kivy/uix/carousel.py", line 194, in _curr_slide
     return self.slides[self.index or 0]
 IndexError: list index out of range
 Exception ignored in: 'kivy.properties.observable_list_dispatch'
 Traceback (most recent call last):
   File "kivy/properties.pyx", line 599, in kivy.properties.Property.dispatch
     ps.observers.dispatch(obj, ps.value, None, None, 0)
   File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
     result = self._dispatch(
   File "kivy/_event.pyx", line 1120, in kivy._event.EventObservers._dispatch
     return f(obj, value)
   File "kivy/properties.pyx", line 1503, in kivy.properties.AliasProperty.trigger_change
     cpdef trigger_change(self, EventDispatcher obj, value):
   File "kivy/properties.pyx", line 1505, in kivy.properties.AliasProperty.trigger_change
     dvalue = ps.getter(obj)
   File "/tmp/firefox/kivy/kivy/uix/carousel.py", line 194, in _curr_slide
     return self.slides[self.index or 0]
 IndexError: list index out of range

1 Ответ

0 голосов
/ 21 марта 2020

Проблема в том, что ваш текущий слайд является последним:

c.index = N_SLIDES - 1  # switch to the last slide

Затем, когда вы удаляете слайд, этот index теперь равен out of range. Это может считаться ошибкой в ​​коде Carousel (возможно, в этом случае следует настроить index). В любом случае, вот версия вашего кода, которая корректирует index при необходимости:

from kivy.app import App
from kivy.factory import Factory
from kivy.clock import Clock
import random


N_SLIDES = random.choice(range(2, 4))  # Has to be 2 or greater

class SampleApp(App):
    def build(self):
        c = Factory.Carousel()
        for i in range(N_SLIDES):
            c.add_widget(Factory.Label(text=str(i), font_size=100))
        c.index = N_SLIDES - 1  # switch to the last slide
        return c

    def on_start(self):
        c = self.root
        Clock.schedule_once(self.do_remove, c.anim_move_duration + 1)
        # Clock.schedule_once(
        #     lambda __: c.remove_widget(random.choice(c.slides)),  # remove any slide
        #     c.anim_move_duration + 1)

    def do_remove(self, dt):
        c = self.root
        to_remove = random.choice(c.slides)
        if c.index >= len(c.slides) - 1:
            c.index = len(c.slides) - 2
        c.remove_widget(to_remove)

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