Squeak.ru - шаблоны программирования

Как легко и чисто обновить изображение в виджете Kivy из python?

Во-первых, это большой кусок кода, поэтому я постараюсь упростить его ради этого вопроса. У меня есть сценарий Kivy Language с корневым виджетом, панелью действий и макетом коробки. Общая структура кода выглядит примерно так (я не думаю, что это требуется для ответа на этот вопрос, но все же здесь): Root > MenuBarWidg > BoxLayout > Image + Other buttons/labels....

А вот как выглядит мой виджет в kivy (для boxlayout):

<DisplayPhoto>:
    Image:
        id: image_display
        allow_strech: True
        #StringProperty in the class
        source: root.image_path

    Button:

Внутри моего скрипта Python:

class DisplayPhoto(BoxLayout):
    image_path = StringProperty()
    def __init__(self, **kwargs):
        super(DisplayPhoto, self).__init__(self)
        self.image_path = 'reload.png'

    #this is called from another class on a button press
    def update(self):
        self.image_path = 'new_image_path.png'

При вызове обновления в скрипте python ничего не происходит. Я пробовал print(self.image_path), который отображает new_image_path.png, но это также строка, а не объект kivy.

Я пробовал такие вещи, как обновление source, вызывая id и т. д., но ничего не добился. Любая помощь приветствуется!



Ответы:


1

Я думаю, проблема в том, как вы вызываете этот метод update().

Пожалуйста, обратитесь к следующему коду

Один из способов сделать это:

main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout

from kivy.config import Config
Config.set('graphics', 'position', 'custom')
Config.set('graphics', 'left', 0)
Config.set('graphics', 'top', 0)

Builder.load_file('main.kv')


class MainView (BoxLayout):
    image_source = StringProperty()

    def __init__(self, **kwargs):
        super(MainView, self).__init__(**kwargs)
        self.image_source = 'pic1.png'


class AnotherClass(BoxLayout):

    def change_image(self):
        app = App.get_running_app()
        app.root.ids['my_image'].source = 'pic2.png'


class ImageChangeApp (App):

    def build(self):
        return MainView()


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

main.kv:

<MainView>:
    Image:
        id: my_image
        source: root.image_source
    AnotherClass:


<AnotherClass>:
    Button:
        text: 'Change picture'
        on_release: root.change_image()

Другой способ сделать это - использовать диспетчер событий.

main.py:

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout

from kivy.config import Config
Config.set('graphics', 'position', 'custom')
Config.set('graphics', 'left', 0)
Config.set('graphics', 'top', 0)

Builder.load_file('main.kv')


class MainView (BoxLayout):
    pass


class DisplayPhoto(BoxLayout):
    image_path = StringProperty()

    def __init__(self, **kwargs):
        super(DisplayPhoto, self).__init__(**kwargs)
        self.image_path = 'pic1.png'
        self.register_event_type('on_image_path')

    def on_image_path(self, instance, val):
        print(instance)
        print(val)
        self.image_path = val


class AnotherClass(BoxLayout):

    def change_image(self):
        app = App.get_running_app()
        app.root.ids['display_photo'].dispatch('on_image_path', self, 'pic2.png')


class ImageChangeApp (App):

    def build(self):
        return MainView()


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

основной.кв

<MainView>:

    DisplayPhoto:
        id: display_photo

    AnotherClass:

<DisplayPhoto>:
    Image:
        source: root.image_path

<AnotherClass>:
    Button:
        text: 'Change picture'
        on_release: root.change_image()
07.10.2019
  • Извините, что только что увидел это так поздно... Второй пример с диспетчером событий работал как шарм. Благодарю вас! 09.10.2019
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...