Kivy轮播切换时的事件

3 投票
2 回答
2464 浏览
提问于 2025-04-18 20:15

我对解决我的问题没有任何头绪。

我做了一个应用程序,里面有一个轮播组件。在这个轮播里,我有4个幻灯片:欢迎幻灯片 -> DVD幻灯片 -> DVD预览幻灯片 -> 分类幻灯片。我为每个幻灯片都创建了一个类。

我使用了一个列表适配器来显示从Sqlite3数据库提取的数据。

我遇到的问题是关于列表的刷新。当我在DVD幻灯片中修改一个DVD(比如给预览添加名字)时,当我滑动到DVD预览幻灯片时,DVD并没有出现,因为列表没有刷新。

根据轮播的文档,我找不到滑动变化时的事件。如果有一个事件可以获取当前幻灯片的索引,那就太好了。

你有什么想法吗?

谢谢,

2 个回答

0

如果你想要一个纯Python的解决方案,而不是使用Kivy语言的方案,你可以自己创建一个轮播图(carousel),这个轮播图可以继承自Kivy的轮播图,方法如下。

import kivy      
from kivy.uix.carousel import Carousel 

class MyCarousel(Carousel):
    # This class is a carousel that runs script
    # when a slide gets focus (except first load).
    def on_index(self, *args):
        print('the slide is', self.index)
        # YOUR CODE GOES HERE
        Carousel.on_index(self, *args)

6

你可以观察 index 属性:

from kivy.uix.carousel import Carousel
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.lang import Builder

Builder.load_string('''
<Page>:
    Label:
        text: str(id(root))

<Carousel>
    on_index: print("slide #{}".format(args[1]))
''')

class Page(BoxLayout):
    pass

class TestApp(App):
    def build(self):
        root = Carousel()
        for x in range(10):
            root.add_widget(Page())
        return root

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

或者你也可以观察 current_slide 属性:

from kivy.uix.carousel import Carousel
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.lang import Builder

Builder.load_string('''
<Page>:
    label_id: label_id
    Label:
        id: label_id
        text: str(id(root))

<Carousel>
    on_current_slide: print(args[1].label_id.text)
''')

class Page(BoxLayout):
    pass

class TestApp(App):
    def build(self):
        root = Carousel()
        for x in range(10):
            root.add_widget(Page())
        return root

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

撰写回答