Как стать автором
Обновить

Комментарии 10

Спасибо за материал.

Было бы здорово также почитать про написание расширений для Kivy — насколько это сложно, что нужно сделать или переопределить и пр.
Спасибо за идею — возьму на заметку. Там тоже есть нюансы, о которых стоит рассказать. Если меня никто не опередит — будет статья и об этом.

Спасибо за материал. Писал что-то похожее для своих проектов. Модуль именован KDialog. Кстати, как насчет мультипоточности в Kivy — твой пакет прерывает выполнение программы при появлении окна выбора, скажем, "Да/Нет"?

Не прерывает. Отображение всплывающего окна — это всего лишь создание нового виджета. Как только виджет прорисован — интерпретатор выполняет следующую строку кода.
Кстати, интересно было бы посмотреть на KDialog. Он где-нибудь опубликован?

Да. На github. kdialog.py

Интересное решение, особенно с rst хорошо придумал. А реализацию param=«loaddialog» я бы реализовал по-другому.
Почитай про объекты kivy.clock.Clock и kivy.network.urlrequest.Urlrequest

Про эти объекты мне известно. Дело в том, что невозможно (по крайней мере, у меня не получилось) создать диалоговое окно загрузки чего-либо, закрыть его и вывести следующий экран. Поэтому в модуле реализованы такие костыли. Если тебе удалось решить это, с удовольствием посмутрю на твое решение.

Если я правильно понял проблему, то вот решение (на примере твоего класса):
    import kivy
    kivy.require("1.9.1")
    from kivy.app import App

    class Demo(App):
        def build(self):
            return Button(text='Press me!', on_release=self.show_dialog_async)

        @staticmethod
        def show_dialog_async(instance):
            progress = KDialog()

            def on_success(request, response):
                print('Success!')
                progress.body.dismiss()
                window = KDialog(
                    background_color=[0.4823529411764706, 0.49411764705882355, 0.5215686274509804, 1.0])
                window.show(text=response, rst=True, size_rst=(.9, .9), text_button_ok="OK", param="query")

            def on_redirect(request, result):
                new_url = request.resp_headers['location']
                print('Redirected to %s' % new_url)
                print(result)
                send_req(new_url)

            def send_req(url):
                UrlRequest(url=url, debug=True, on_success=on_success, on_redirect=on_redirect)

            progress.show(image="timerloading.gif", param="loaddialog", text='Loading...')
            send_req('http://python.org')

    Demo().run()


Urlrequest — потомок класса Thread. В принципе здесь делаем то же самое, что и твой костыль, только еще и тянем данные по указанному url. А kivy main thread в это время спокойно может прорисовывать интерфейс.

Обрати внимание на то, как перед отображением 2-го окна gif замирает — в этот момент основной поток приложения занят обработкой этой строки:
    window.show(text=response, rst=True, size_rst=(.9, .9), text_button_ok="OK", param="query")

Если хочешь избавиться и от этого — создавай RstDocument в отдельном потоке и callback'ом отображай 2-е окно. Имхо — это уже лишнее.

Нет, ты не понял. Точнее я не так обрисовал ситуацию. Ломается экран, когда пытаешься в процессе загрузки, например, менять лейбл окна, после чего собираешься вывести новый экран в ScreenManager. Утром в личку пришлю пример.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории