Python 基维';Carousel.remove#u widget()';原因索引器

Python 基维';Carousel.remove#u widget()';原因索引器,python,kivy,Python,Kivy,“Carousel.remove_widget()”在最后一张幻灯片处于活动状态时会导致Indexer错误,并且错误不会传递给用户。如何绕过索引错误异常 当在代码中调用remove_widget()或clear_widgets()时,它会给出和索引错误。如何绕过索引错误 这是密码 from kivy.app import App from kivy.factory import Factory from kivy.clock import Clock import random N_SLID

“Carousel.remove_widget()”在最后一张幻灯片处于活动状态时会导致Indexer错误,并且错误不会传递给用户。如何绕过索引错误异常

当在代码中调用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

问题是您当前的幻灯片是最后一张:

c.index = N_SLIDES - 1  # switch to the last slide
然后,当您删除幻灯片时,
索引
现在超出范围。这可能被认为是
Carousel
代码中的一个bug(在这种情况下,它可能应该调整
索引
)。无论如何,这里有一个版本的代码,可以在需要时调整
索引

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()

问题是您当前的幻灯片是最后一张:

c.index = N_SLIDES - 1  # switch to the last slide
然后,当您删除幻灯片时,
索引
现在超出范围。这可能被认为是
Carousel
代码中的一个bug(在这种情况下,它可能应该调整
索引
)。无论如何,这里有一个版本的代码,可以在需要时调整
索引

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()
提供