Python 基维';Carousel.remove#u widget()';原因索引器
“Carousel.remove_widget()”在最后一张幻灯片处于活动状态时会导致Indexer错误,并且错误不会传递给用户。如何绕过索引错误异常 当在代码中调用remove_widget()或clear_widgets()时,它会给出和索引错误。如何绕过索引错误 这是密码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
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()
提供