Kivy — Создание мобильных приложений на Python (Часть 2)

Мобильная веб-разработка на Python становится все более популярной. И хотя Python изначально не создавался для создания ПО для смартфонов и планшетов, благодаря Kivy это стало возможным. Сегодня мы продолжаем рассматривать особенности использования этого фреймворка. В частности, поговорим о том, что такое язык дизайна  KV, как создавать приложение Kivy, генерировать установочный apk-пакет, как создавать программу для iOS, используя Python.

Использование языка дизайна KV

В поставку Kivy входит язык KV, с помощью которого создается дизайн приложений. С помощью этого языка можно отдельно работать с дизайном, не затрагивая логику приложения. В него входит поддержка принципа разделения ответственности, и Kivy является частью архитектурного паттерна «Модель-Представление-Контроллер). 

Давайте используем язык KV, чтобы внести некоторые изменения в предыдущий пример. 

from kivy.app import App

from kivy.uix.button import Button

 

class ButtonApp(App):

    def build(self):

        return Button()

 

    def on_press_button(self):

        print('Вы нажали на кнопку!')

 

if __name__ == '__main__':

    app = ButtonApp()

    app.run()

Первоначально такой синтаксис может показаться странным, поскольку создание кнопки осуществляется без каких-либо атрибутов. Также к ней не привязываются никакие события. Здесь Kivy пытается найти файл, имеющий такое же имя, как и у класса, только строчными буквами и без части App в названии. 

В этом примере в качестве имени класса выступает ButtonApp. Следовательно, Kivy будет искать button.kv. Если такой файл есть в наличии, а его форматирование было выполнено правильно, то Kivy его будет использовать при загрузке UI. 

Давайте попробуем создать такой файл и добавить следующий код: 

<Button>:

    text: 'Press me'

    size_hint: (.5, .5)

    pos_hint: {'center_x': .5, 'center_y': .5}

    on_press: app.on_press_button()

Что делает каждая из этих строк?

  • Выполняет действия, аналогичные вызову Button в коде приложения на Python. Задача – осмотреть инициализированный объект для определения кнопки.
  1. Устанавливает значение text для кнопки. 
  2. Устанавливает ширину и высоту кнопки. Для этого используется size_hint.
  3. Используя pos_hint устанавливает позицию кнопки.
  4. Устанавливает событие при нажатии on_press. Чтобы передать Kivy место обработчика событий, необходимо использовать app.on_press_button(). Здесь Kivy будет осуществлять поиск соответствующего метода в классе Application.

Разработчик может установить все виджеты и лейауты внутри одного либо нескольких файлов KV. Этот язык также умеет импортировать модули Python. При этом создаются динамические классы. 

И это далеко не все, что он умеет. Более подробную информацию можно получить в официальной документации Kivy.

Теперь мы можем создать реальное приложение.

Как создать приложение Kivy?

Любой навык удобнее всего получать, используя знания на практике. Поэтому давайте попробуем сделать калькулятор, который будет поддерживать такие операции:

  1. Сложение.
  2. Вычитание.
  3. Умножение.
  4. Деление.

В этой программе будет использоваться набор кнопок в своего рода лейауте. Сверху также будет находиться специальный блок, в котором будут отображаться результаты операций.

В результате, калькулятор должен выглядеть так:

Теперь, когда мы имеем целевой пользовательский интерфейс, мы можем приступить к созданию кода. 

from kivy.app import App

from kivy.uix.boxlayout import BoxLayout

from kivy.uix.button import Button

from kivy.uix.textinput import TextInput




class MainApp(App):

    def build(self):

        self.operators = ["/", "*", "+", "-"]

        self.last_was_operator = None

        self.last_button = None

        main_layout = BoxLayout(orientation="vertical")

        self.solution = TextInput(

            multiline=False, readonly=True, halign="right", font_size=55

        )

        main_layout.add_widget(self.solution)

        buttons = [

            ["7", "8", "9", "/"],

            ["4", "5", "6", "*"],

            ["1", "2", "3", "-"],

            [".", "0", "C", "+"],

        ]

        for row in buttons:

            h_layout = BoxLayout()

            for label in row:

                button = Button(

                    text=label,

                    pos_hint={"center_x": 0.5, "center_y": 0.5},

                )

                button.bind(on_press=self.on_button_press)

                h_layout.add_widget(button)

            main_layout.add_widget(h_layout)




        equals_button = Button(

            text="=", pos_hint={"center_x": 0.5, "center_y": 0.5}

        )

        equals_button.bind(on_press=self.on_solution)

        main_layout.add_widget(equals_button)




        return main_layout

Принцип работы калькулятора следующий:

  1. Строки 8-10. Здесь создается список operators, а также ряд других значений, которые будут использоваться далее. Это такие значения, как last_was_operator и last_button.
  2. Строки 11-15. Мы создаем main_layout, который будет лейаутом верхнего уровня. К нему будет присоединен виджет только для чтения TextInput.
  3. Строки 16-21. Из списков, хранящих большинство кнопок приложения, создается большой вложенный список. 
  4. Строка 22. Здесь мы инициализируем начало цикла for для кнопок. Выполняются такие действия для каждого из вложенных списков:
    1. Строка 23. Создается горизонтально ориентированный BoxLayout.
    2. Строка 24. Здесь инициализируется начало еще одного цикла for для объектов, входящих во вложенный список. 
    3. Строки 25-39. Добавляются кнопки и обработчики событий к ним. Затем они добавляются в качестве части горизонтального BoxLayout из строки 23.
    4. Строка 31. Здесь мы добавляем наш лейаут к main_layout.
  5. Строки 33-37. Здесь создается кнопка равно (=) и привязывается к обработчику событий. Затем она добавляется к main_layout.

После выполнения всех этих действий создается обработчик .on_button_press(). Код будет таким. 

def on_button_press(self, instance):

    current = self.solution.text

    button_text = instance.text




    if button_text == "C":

        # Очистка виджета с решением

        self.solution.text = ""

    else:

        if current and (

            self.last_was_operator and button_text in self.operators):

            # Не добавляйте два оператора подряд, рядом друг с другом

            return

        elif current == "" and button_text in self.operators:

            # Первый символ не может быть оператором

            return

        else:

            new_text = current + button_text

            self.solution.text = new_text

    self.last_button = button_text

    self.last_was_operator = self.last_button in self.operators

Почти каждый виджет программы ассоциирован с методом .on_button_press, поскольку подавляющее число виджетов в нашем приложении – это кнопки.

И, наконец, мы добавляем функцию .on_solution()

def on_solution(self, instance):

    text = self.solution.text

    if text:

        solution = str(eval(self.solution.text))

        self.solution.text = solution

Здесь функция получает текстовые данные из solution, после чего задействуется функция eval() для вычислений. Если пользователем создается формула типа 1+2, то eval возвращает результат. В конце результат устанавливается в качестве нового значения виджета solution.

В некоторых случаях использование eval() не рекомендуется из-за запуска произвольного кода. Нередко разработчики Python стараются его не использовать как раз по такой причине. При этом, поскольку мы используем лишь целые числа, операторы и точку в качестве входных данных, то в этом примере eval() является довольно безопасной функцией.

После того, как мы запустим приведенный выше код, появится такое окно с приложением.Kivy - Создание мобильных приложений на Python (Часть 2)

После того, как мы создали приложение, его необходимо опубликовать в магазине операционной системы, для которой программа разрабатывалась.

Как создать apk-файл?

После того, как мы закончили создавать код программы Android, необходимо упаковать ее в apk-файл.

Сперва используем pip, чтобы инсталлировать пакет buildozer.

$ pip install buildozer

После этого нам нужно создать новую папку, а потом открыть ее в терминале. Затем дать такую инструкцию.

$ buildozer init

Затем создается файл buldozer.spec, использующийся для конфигурации сборки. Например, первые две строки файла спецификации можно редактировать так. 

[app]

 

# (str) Название вашего приложения

title = KvCalc

 

# (str) Название упаковки

package.name = kvcalc

 

# (str) Домен упаковки (нужен для упаковки android/ios)

package.domain = org.kvcalc

Фактически приложение уже готово к сборке, но необходимо установить зависимости. После того, как вы это сделаете, скопируйте программу в новую папку и переместите в main.py

Выполните команду.

$ buildozer -v android debug

Через 15-20 минут будет создан файл, который переносим в смартфон и запускаем. После установки программы запускаем ее и получаем следующий результат.Kivy - Создание мобильных приложений на Python (Часть 2)

Как создать приложение для iOS

iOS – вторая по популярности операционная система. Поэтому многие разработчики хотели бы создать мобильное приложение для нее.

Чтобы собрать приложение для iOS, необходимо воспользоваться компьютером под управлением OS X: MacBook, iMac. 

Перед тем, как упаковать программу для iOS, выполните следующие команды. 

$ brew install autoconf automake libtool pkg-config

$ brew link libtool

$ sudo easy_install pip

$ sudo pip install Cython==0.29.10

После выполнения этих команд необходимо дать еще такие инструкции. 

$ git clone git://github.com/kivy/kivy-ios

$ cd kivy-ios

$ ./toolchain.py build python3 kivy

Если вам отображается ошибка, где говорится, что iphonesimulator не удалось найти, тогда попробуйте найти решение проблемы на StackOverflow

Если появляется ошибка SSL, тогда, с высокой долей вероятности, у вас не установлен OpenSSL. Введите следующую команду, чтобы исправить эту проблему. 

Shell

$ cd /Applications/Python\ 3.7/

$ ./Install\ Certificates.command

Теперь вернитесь назад и запустите команду повторно. 

После того, как эти команды будут выполнены, можно создать проект Xcode с использованием скрипта toolchain. Переименуйте приложение в main.py, а потом выполните следующую команду.

./toolchain.py create <title> <app_directory>

Далее остается этот проект открыть в среде разработки и компилировать готовое приложение.

ОфисГуру
Adblock
detector