Кнопка для переключения экрана внутри Kivy карусели - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь создать кнопку для изменения / возврата к предыдущему экрану внутри карусели.

Я привык управлять кнопками в файле .kv, но для карусели это невозможно, если я сделаю так, чтобы на последнем слайде была создана только одна кнопка.

Мне нужно, чтобы кнопка присутствовала на каждом слайде, поэтому я сделал это, и она работает хорошо, за исключением того, что я не знаю, как связать кнопку с ScreenManager.

Часть моего файла python:

class MyCarousel(Carousel):
    def __init__(self, **kwargs):
        super(MyCarousel, self).__init__(**kwargs)
        self.direction = "right"
        log_file = open_logfile()
        for i in range(log_file['len']):
            src = log_file['path'][(log_file['len']) - (i + 1)] + "_file_resize.jpg"
            button = Button(size_hint=(.15,.25),\
                    pos_hint={'center_x': .05, 'y': .65},\
                    background_color=(1, 1, 1, 1),\
                    border=(0, 0, 0, 0),\
                    on_release=***???***
                    background_normal="Interface_PNG/bouton/Bouton_retour.png",\
                    background_down="Interface_PNG/bouton/Bouton_retour_fonce.png")
            image = AsyncImage(source=src, allow_stretch=True, size_hint=(1, 1), pos_hint={'center_x': .5, 'y': 0})
            layout = FloatLayout()
            layout.add_widget(image)
            layout.add_widget(button)
            self.add_widget(layout)
        self.loop = True

class StartScreen(Screen):
    pass

class GalleryPhoto(Screen):
    def call_next(self, dt):
        self.manager.current = "start"

class RootScreen(ScreenManager):
    pass

class PhotoboothApp(App):
    def build(self):
        sm = RootScreen()
        self.start_screen = StartScreen()
        self.gallery_photo = GalleryPhoto()
        sm.add_widget(self.start_screen)
        sm.add_widget(self.gallery_photo)
        return sm

Часть моего файла kv:

<StartScreen>:
    name: "start"
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
    FloatLayout:
        Image:
            source: "Interface_PNG/Page_1.png"
            allow_stretch : True
            keep_ratio : False
            size_hint: 1, 1
        Button:
            background_color: 0, 0, 0, 0
            on_release: root.manager.current = "gallery"

<GalleryPhoto>:
    name: "gallery"
    FloatLayout:
        Image:
            source: "Interface_PNG/Page_8.png"
            allow_stretch: True
            keep_ratio: False
            size_hint: 1, 1
        MyCarousel:

Я бы хотел сделать что-то подобное, но на python:

 MyCarousel:
     Button:
        on_release: root.manager.current = "start"

Я думаю, это просто, но я немного растерялся ... Любая помощь приветствуется.

1 Ответ

1 голос
/ 06 июня 2019
  • Реализация метода change_screen() в class MyCarousel()
  • Кнопка привязки к методу change_screen()
  • Использование App.get_running_app().root для доступа к экземпляру корневого объекта ScreenManager.

Snippets - py

class MyCarousel(Carousel):
    def __init__(self, **kwargs):
        ...
            button = Button(size_hint=(.15,.25), pos_hint={'center_x': .05, 'y': .65},
                            background_color=(1, 1, 1, 1), border=(0, 0, 0, 0),
                            on_release=self.change_screen(),

            ...

    def change_screen(self, instance):
        App.get_running_app().root.current = 'start'

Пример

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.carousel import Carousel
from kivy.uix.image import AsyncImage
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder


class MyCarousel(Carousel):
    def __init__(self, **kwargs):
        super(MyCarousel, self).__init__(**kwargs)
        self.direction = "right"

        for i in range(10):
            src = "http://placehold.it/480x270.png&text=slide-%d&.png" % i
            image = AsyncImage(source=src, allow_stretch=True, size_hint=(1, 1), pos_hint={'center_x': .5, 'y': 0})
            button = Button(size_hint=(.15, .25), pos_hint={'center_x': .05, 'y': .65},
                            text='StartScreen',
                            on_release=self.change_screen)

            layout = FloatLayout()
            layout.add_widget(image)
            layout.add_widget(button)
            self.add_widget(layout)
        self.loop = True

    def change_screen(self, instance):
        App.get_running_app().root.current = 'start'


class StartScreen(Screen):
    pass


class GalleryPhoto(Screen):
    pass


class RootScreen(ScreenManager):
    pass


Builder.load_file("main.kv")


class TestApp(App):
    title = "Photobooth"

    def build(self):
        return RootScreen()


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

main.kv

<RootScreen>:
    StartScreen:
    GalleryPhoto:


<StartScreen>:
    name: "start"
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
    FloatLayout:
        Image:
            source: "kivy-logo.png"
            allow_stretch : True
            keep_ratio : True   # False
            size_hint: 1, 1
        Button:
            background_color: 0, 0, 0, 0
            on_release: root.manager.current = "gallery"

<GalleryPhoto>:
    name: "gallery"
    FloatLayout:
        Image:
            source: "kivymd_logo.png"
            allow_stretch: True
            keep_ratio: False
            size_hint: 1, 1
        MyCarousel:

Выход

Before changing to StartScreen StartScreen

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...