Создайте мобильное приложение с Kivy Python Framework

28 апреля, 2020

Подписывайся на наш канал в Telegram, чтобы ежедневно совершенствоваться в Python. Там выходят задачи, полезные советы и сливы платных курсов - перейти

Перевод статьи

Оглавление

В наши дни разработчики, скорее всего, будут работать над мобильным или веб-приложением. Python не имеет встроенных возможностей мобильной разработки, но есть пакеты, которые вы можете использовать для создания мобильных приложений, таких как Kivy, PyQt или даже библиотека Toga Beeware .

Все эти библиотеки являются основными игроками в мобильном пространстве Python. Однако есть некоторые преимущества, которые вы увидите, если решите создавать мобильные приложения с Kivy . Мало того, что ваше приложение будет выглядеть одинаково на всех платформах, вам также не нужно будет компилировать код после каждого изменения. Более того, вы сможете использовать понятный синтаксис Python для создания своих приложений.

В этом уроке вы узнаете, как:

  • Работа с виджетами Kivy
  • Выложи пользовательский интерфейс
  • Добавить события
  • Используйте язык KV
  • Создать приложение калькулятора
  • Упакуйте свое приложение для iOS, Android, Windows и macOS

В этом руководстве предполагается, что вы знакомы с объектно-ориентированным программированием. Если нет, то ознакомьтесь с объектно-ориентированным программированием (ООП) в Python 3 .

Давайте начнем!

Понимание Kivy Framework

Впервые Kivy был выпущен в начале 2011 года. Эта кроссплатформенная среда Python может быть развернута на Windows, Mac, Linux и Raspberry Pi. Он поддерживает мультисенсорные события в дополнение к обычным вводам с клавиатуры и мыши. Kivy даже поддерживает графическое ускорение своей графики, поскольку они построены с использованием OpenGL ES2. В проекте используется лицензия MIT, поэтому вы можете использовать эту библиотеку для бесплатного и коммерческого программного обеспечения.

Когда вы создаете приложение с Kivy, вы создаете Natural User Interface или NUI . Идея Natural User Interface заключается в том, что пользователь может легко научиться использовать ваше программное обеспечение практически без инструкций.

Kivy не пытается использовать собственные элементы управления или виджеты. Все его виджеты сделаны на заказ. Это означает, что приложения Kivy будут выглядеть одинаково на всех платформах. Тем не менее, это также означает, что внешний вид вашего приложения будет отличаться от собственных приложений вашего пользователя. Это может быть выгодой или недостатком, в зависимости от вашей аудитории.

Установка Кивы

Kivy имеет много зависимостей, поэтому рекомендуется установить его в виртуальную среду Python. Вы можете использовать либо встроенную venvбиблиотеку Python, либо virtualenvпакет. Если вы никогда ранее не использовали виртуальную среду Python, ознакомьтесь с разделом Виртуальные среды Python: Учебник для начинающих .

Вот как вы можете создать виртуальную среду Python:

$ python3 -m venv my_kivy_project

Это скопирует ваш исполняемый файл Python 3 в папку с именем my_kivy_projectи добавит несколько других подпапок в этот каталог.

Чтобы использовать вашу виртуальную среду, вам необходимо активировать ее. В Mac и Linux вы можете сделать это, выполнив следующее в my_kivy_projectпапке:

$ source bin/activate

Команда для Windows похожа, но Scriptsвместо нее находится сценарий активации внутри папки bin.

Теперь, когда у вас есть активированная виртуальная среда Python, вы можете запустить pipустановку Kivy. В Linux и Mac вы выполните следующую команду:

$ python -m pip install kivy

В Windows установка немного сложнее. Ознакомьтесь с официальной документацией о том, как установить Kivy на Windows . (Пользователи Mac также могут скачать dmgфайл и установить Kivy таким образом.)

Если у вас возникнут проблемы с установкой Kivy на вашей платформе, обратитесь к странице загрузки Kivy за дополнительными инструкциями .

Работа с Kivy Widgets

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

Запуск «Привет, Киви!» программа

Чтобы увидеть, как работает Kivy, взгляните на следующее «Hello, World!» применение:

from kivy.app import App
from kivy.uix.label import Label

class MainApp(App):
    def build(self):
        label = Label(text='Hello from Kivy',
                      size_hint=(.5, .5),
                      pos_hint={'center_x': .5, 'center_y': .5})

        return label

if __name__ == '__main__':
    app = MainApp()
    app.run()

Каждое приложение Kivy должно иметь подкласс Appи переопределение build(). Здесь вы можете поместить свой код пользовательского интерфейса или вызвать другие функции, которые определяют ваш код пользовательского интерфейса. В этом случае необходимо создать Labelвиджет и передать в ее textsize_hintи pos_hint. Эти последние два аргумента не обязательны.

size_hintсообщает Kivy пропорции, которые следует использовать при создании виджета. Требуется два числа:

  1. Первое число является xподсказкой размера и относится к ширине элемента управления.
  2. Второе число является yподсказкой размера и относится к высоте элемента управления.

Оба эти числа могут быть где угодно между 0 и 1. Значением по умолчанию для обоих подсказок является 1. Вы также можете использовать pos_hintдля позиционирования виджета. В приведенном выше блоке кода вы указываете Kivy центрировать виджет по осям x и y.

Чтобы заставить приложение работать, вы создаете экземпляр своего MainAppкласса и затем вызываете run(). Когда вы сделаете это, вы должны увидеть на экране следующее:

Привет Мир в Киви

Киви также выводит много текста stdout:

[INFO   ] [Logger      ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO   ] [Kivy        ] v1.11.0
[INFO   ] [Kivy        ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0]
[INFO   ] [Python      ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO   ] [Factory     ] 184 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_gif (img_pil, img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2(['text_pango'] ignored)
[INFO   ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] Backend used <sdl2>
[INFO   ] [GL          ] OpenGL version <b'4.6.0 NVIDIA 390.116'>
[INFO   ] [GL          ] OpenGL vendor <b'NVIDIA Corporation'>
[INFO   ] [GL          ] OpenGL renderer <b'NVS 310/PCIe/SSE2'>
[INFO   ] [GL          ] OpenGL parsed version: 4, 6
[INFO   ] [GL          ] Shading version <b'4.60 NVIDIA'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <32>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [Base        ] Start application main loop
[INFO   ] [GL          ] NPOT texture support is available

Это полезно для отладки вашего приложения.

Далее вы попробуете добавить Imageвиджет и посмотрите, чем он отличается от Label.

Отображение изображения

В Kivy есть несколько различных виджетов, связанных с изображениями. Вы можете использовать Imageдля загрузки локальных изображений с жесткого диска или AsyncImageдля загрузки изображения с URL-адреса. В этом примере вы будете придерживаться стандартного Imageкласса:

from kivy.app import App
from kivy.uix.image import Image

class MainApp(App):
    def build(self):
        img = Image(source='/path/to/real_python.png',
                    size_hint=(1, .5),
                    pos_hint={'center_x':.5, 'center_y':.5})

        return img

if __name__ == '__main__':
    app = MainApp()
    app.run()

В этом коде вы импортируете Imageиз kivy.uix.imageподпакета. ImageКласс занимает много различных параметров, но тот , который вы хотите использовать source. Это говорит Kivy, какое изображение загрузить. Здесь вы передаете полный путь к изображению. Остальная часть кода такая же, как вы видели в предыдущем примере.

Когда вы запустите этот код, вы увидите что-то вроде следующего:

Показ изображения с Kivy

Текст из предыдущего примера был заменен изображением.

Теперь вы узнаете, как добавить и упорядочить несколько виджетов в вашем приложении.

Выкладываем пользовательский интерфейс

Каждая используемая вами структура графического интерфейса имеет собственный метод размещения виджетов. Например, в wxPython вы будете использовать размеры, а в Tkinter вы используете менеджер макетов или геометрии. С Kivy вы будете использовать макеты . Есть несколько различных типов макетов, которые вы можете использовать. Вот некоторые из наиболее распространенных:

  • BoxLayout
  • FloatLayout
  • GridLayout

Вы можете найти в документации Kivy полный список доступных макетов. Вы также можете посмотреть kivy.uixфактический исходный код.

Попробуйте BoxLayoutс этим кодом:

import kivy
import random

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

red = [1,0,0,1]
green = [0,1,0,1]
blue =  [0,0,1,1]
purple = [1,0,1,1]

class HBoxLayoutExample(App):
    def build(self):
        layout = BoxLayout(padding=10)
        colors = [red, green, blue, purple]

        for i in range(5):
            btn = Button(text="Button #%s" % (i+1),
                         background_color=random.choice(colors)
                         )

            layout.add_widget(btn)
        return layout

if __name__ == "__main__":
    app = HBoxLayoutExample()
    app.run()

Здесь вы импортировать BoxLayoutиз kivy.uix.boxlayoutи создать его экземпляр. Затем вы создаете список цветов, которые сами являются списками красно-сине-зеленых (RGB) цветов. Наконец, вы перебираете range5, создавая кнопку btnдля каждой итерации. Чтобы сделать вещи немного веселее, вы устанавливаете background_colorкнопку в случайный цвет. Затем вы добавляете кнопку в свой макет с помощью layout.add_widget(btn).

Когда вы запустите этот код, вы увидите что-то вроде этого:

Использование горизонтального BoxLayout в Kivy

Есть 5 кнопок разного цвета, по одной на каждую итерацию forцикла.

Когда вы создаете макет, есть несколько аргументов, которые вы должны знать:

  • padding: Вы можете указать paddingв пикселях между макетом и его дочерними элементами одним из трех способов:
    1. Список четыре-аргумента: [ padding_leftpadding_toppadding_rightpadding_bottom]
    2. Список с двумя аргументами: [ padding_horizontalpadding_vertical]
    3. Единственный аргумент: padding=10
  • spacing: Вы можете добавить пробел между дочерними виджетами с этим аргументом.
  • orientation: Вы можете изменить значение orientationпо умолчанию BoxLayoutс горизонтального на вертикальное.

Добавление событий

Как и большинство инструментов GUI, Kivy в основном основан на событиях . Каркас реагирует на нажатия клавиш пользователя, события мыши и сенсорные события. В Kivy есть концепция часов, которую вы можете использовать для планирования вызовов функций на некоторое время в будущем.

Киви также имеет концепцию Properties, которая работает с EventDispatcher. Свойства помогут вам сделать проверку проверки. Они также позволяют запускать события всякий раз, когда виджет меняет свой размер или положение.

Давайте добавим событие кнопки к вашему коду кнопки ранее:

from kivy.app import App
from kivy.uix.button import Button

class MainApp(App):
    def build(self):
        button = Button(text='Hello from Kivy',
                        size_hint=(.5, .5),
                        pos_hint={'center_x': .5, 'center_y': .5})
        button.bind(on_press=self.on_press_button)

        return button

    def on_press_button(self, instance):
        print('You pressed the button!')

if __name__ == '__main__':
    app = MainApp()
    app.run()

В этом коде вы вызываете button.bind()и связываете on_pressсобытие с MainApp.on_press_button(). Этот метод неявно принимает виджет instance, который является buttonсамим объектом. Наконец, сообщение будет напечатано stdoutвсякий раз, когда пользователь нажимает вашу кнопку.

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

Kivy также предоставляет язык разработки под названием KV, который вы можете использовать со своими приложениями Kivy. Язык KV позволяет отделить дизайн интерфейса от логики приложения. Это следует принципу разделения интересов и является частью архитектурного шаблона Model-View-Controller . Вы можете обновить предыдущий пример, чтобы использовать язык 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('You pressed the button!')

if __name__ == '__main__':
    app = ButtonApp()
    app.run()

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

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

 1 <Button>:
 2     text: 'Press me'
 3     size_hint: (.5, .5)
 4     pos_hint: {'center_x': .5, 'center_y': .5}
 5     on_press: app.on_press_button()

Вот что делает каждая строка:

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

Вы можете настроить все свои виджеты и макеты внутри одного или нескольких языковых файлов KV. Язык KV также поддерживает импорт модулей Python в KV, создание динамических классов и многое другое. Для получения полной информации, ознакомьтесь с руководством Kivy по языку KV .

Теперь вы готовы создать настоящее приложение!

Создание приложения Kivy

Один из лучших способов выучить новый навык – создать что-то полезное. Имея это в виду, вы будете использовать Kivy для создания калькулятора, который поддерживает следующие операции:

  • прибавление
  • Вычитание
  • умножение
  • разделение

Для этого приложения вам понадобится ряд кнопок в какой-то раскладке. Вам также понадобится поле в верхней части вашего приложения для отображения уравнений и их результатов. Вот эскиз вашего калькулятора:

Kivy Калькулятор Макет

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

 1 from kivy.app import App
 2 from kivy.uix.boxlayout import BoxLayout
 3 from kivy.uix.button import Button
 4 from kivy.uix.textinput import TextInput
 5 
 6 class MainApp(App):
 7     def build(self):
 8         self.operators = ["/", "*", "+", "-"]
 9         self.last_was_operator = None
10         self.last_button = None
11         main_layout = BoxLayout(orientation="vertical")
12         self.solution = TextInput(
13             multiline=False, readonly=True, halign="right", font_size=55
14         )
15         main_layout.add_widget(self.solution)
16         buttons = [
17             ["7", "8", "9", "/"],
18             ["4", "5", "6", "*"],
19             ["1", "2", "3", "-"],
20             [".", "0", "C", "+"],
21         ]
22         for row in buttons:
23             h_layout = BoxLayout()
24             for label in row:
25                 button = Button(
26                     text=label,
27                     pos_hint={"center_x": 0.5, "center_y": 0.5},
28                 )
29                 button.bind(on_press=self.on_button_press)
30                 h_layout.add_widget(button)
31             main_layout.add_widget(h_layout)
32 
33         equals_button = Button(
34             text="=", pos_hint={"center_x": 0.5, "center_y": 0.5}
35         )
36         equals_button.bind(on_press=self.on_solution)
37         main_layout.add_widget(equals_button)
38 
39         return main_layout

Вот как работает код вашего калькулятора:

  • В строках 8 до 10 , необходимо создать список operatorsи пару удобных значений, last_was_operatorи last_button, что вы будете использовать в дальнейшем.
  • В строках с 11 по 15 вы создаете макет верхнего уровня main_layoutи добавляете в него TextInputвиджет только для чтения .
  • В строках с 16 по 21 вы создаете вложенный список списков, содержащий большую часть ваших данных buttonsдля калькулятора.
  • В строке 22 вы начинаете forцикл над ними buttons. Для каждого вложенного списка вы будете делать следующее:
    • В строке 23 вы создаете BoxLayoutгоризонтальную ориентацию.
    • В строке 24 вы запускаете еще один forцикл над элементами во вложенном списке.
    • В строках с 25 по 39 вы создаете кнопки для строки, привязываете их к обработчику событий и добавляете кнопки в горизонталь BoxLayoutот строки 23.
    • В строке 31 вы добавляете этот макет в main_layout.
  • В строках с 33 по 37 вы создаете кнопку равенства ( =), привязываете ее к обработчику событий и добавляете к нему main_layout.

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

41 def on_button_press(self, instance):
42     current = self.solution.text
43     button_text = instance.text
44 
45     if button_text == "C":
46         # Clear the solution widget
47         self.solution.text = ""
48     else:
49         if current and (
50             self.last_was_operator and button_text in self.operators):
51             # Don't add two operators right after each other
52             return
53         elif current == "" and button_text in self.operators:
54             # First character cannot be an operator
55             return
56         else:
57             new_text = current + button_text
58             self.solution.text = new_text
59     self.last_button = button_text
60     self.last_was_operator = self.last_button in self.operators

Большинство виджетов в вашем приложении будут вызывать .on_button_press(). Вот как это работает:

  • Строка 41 принимает instanceаргумент, чтобы вы могли получить доступ к тому, какой виджет вызвал функцию.
  • Строки 42 и 43 извлекают и сохраняют значение solutionкнопки и text.
  • Строки 45–47 проверяют, какая кнопка была нажата. Если пользователь нажал C, то вы очистите solution. В противном случае перейдите к elseутверждению.
  • Строка 49 проверяет, имеет ли решение какое-либо ранее существующее значение.
  • Строки 50–52 проверяют, была ли последняя нажатая кнопка кнопкой оператора. Если это было, то solutionне будет обновляться. Это сделано для того, чтобы у пользователя не было двух операторов подряд. Например, 1 */недопустимое утверждение.
  • Строки с 53 по 55 проверяют, является ли первый символ оператором. Если это так, то solutionобновляться не будет, поскольку первое значение не может быть значением оператора.
  • Строки с 56 по 58 опускаются до elseпункта. Если ни одно из предыдущих условий не выполнено, обновите solution.
  • Строка 59 устанавливает last_buttonметку последней нажатой кнопки.
  • Линия 60 комплектов last_was_operatorв Trueили в Falseзависимости от того, был ли он или нет оператор символов.

Последний бит кода для записи .on_solution():

62 def on_solution(self, instance):
63     text = self.solution.text
64     if text:
65         solution = str(eval(self.solution.text))
66         self.solution.text = solution

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

Примечание: eval() несколько опасно, потому что может запускать произвольный код. Большинство разработчиков избегают использовать его из-за этого факта. Однако, поскольку вы разрешаете вводить только целые числа, операторы и точку eval(), использование в этом контексте безопасно.

Когда вы запустите этот код, ваше приложение будет выглядеть на настольном компьютере следующим образом:

Kivy Calculator

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

Пример полного кодаПоказать спрятать

Вот полный код калькулятора:

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

    def on_button_press(self, instance):
        current = self.solution.text
        button_text = instance.text

        if button_text == "C":
            # Clear the solution widget
            self.solution.text = ""
        else:
            if current and (
                self.last_was_operator and button_text in self.operators):
                # Don't add two operators right after each other
                return
            elif current == "" and button_text in self.operators:
                # First character cannot be an operator
                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

    def on_solution(self, instance):
        text = self.solution.text
        if text:
            solution = str(eval(self.solution.text))
            self.solution.text = solution


if __name__ == "__main__":
    app = MainApp()
    app.run()

Пришло время развернуть ваше приложение!

Упаковка вашего приложения для Android

Теперь, когда вы закончили код для своего приложения, вы можете поделиться им с другими. Отличный способ сделать это – превратить ваш код в приложение, которое может работать на вашем телефоне Android. Для этого сначала вам нужно установить пакет buildozerс именем pip:

$ pip install buildozer

Затем создайте новую папку и перейдите к ней в своем терминале. Когда вы окажетесь там, вам нужно будет выполнить следующую команду:

$ buildozer init

Это создаст buildozer.specфайл, который вы будете использовать для настройки вашей сборки. В этом примере вы можете отредактировать первые несколько строк файла спецификации следующим образом:

[app]

# (str) Title of your application
title = KvCalc

# (str) Package name
package.name = kvcalc

# (str) Package domain (needed for android/ios packaging)
package.domain = org.kvcalc

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

На этом этапе вы почти готовы к созданию приложения, но сначала вам нужно установить зависимости для buildozer. После того, как они установлены, скопируйте приложение калькулятора в новую папку и переименуйте его в main.py. Это требуется buildozer. Если у вас нет правильного имени файла, сборка завершится неудачно.

Теперь вы можете запустить следующую команду:

$ buildozer -v android debug

Шаг сборки занимает много времени! На моей машине это заняло от 15 до 20 минут. В зависимости от вашего оборудования, это может занять больше времени, поэтому не стесняйтесь взять чашку кофе или пробежаться, пока вы ждете. Buildozerзагрузит все компоненты Android SDK, необходимые для процесса сборки. Если все идет по плану, kvcalc-0.1-debug.apkв вашей binпапке будет файл с именем, похожим на что-то похожее .

Следующим шагом является подключение телефона Android к компьютеру и копирование apkфайла на него. Затем вы можете открыть браузер файлов на вашем телефоне и нажать на apkфайл. Android должен спросить вас, хотите ли вы установить приложение. Может появиться предупреждение, поскольку приложение было загружено из-за пределов Google Play, но вы все равно сможете его установить.

Вот калькулятор, работающий на моем Samsung S9:

Kivy Calculator работает на телефоне Android

У buildozerинструмента есть несколько других команд, которые вы можете использовать. Проверьте документацию, чтобы увидеть, что еще вы можете сделать.

Вы также можете упаковать приложение, используя, python-for-androidесли вам нужно более детальный контроль. Вы не будете освещать это здесь, но если вам интересно, посмотрите краткий старт проекта .

Упаковка вашего приложения для iOS

Инструкции по созданию приложения для iOS немного сложнее, чем для Android. Для получения самой последней информации вы всегда должны использовать официальную упаковочную документацию Kivy . Вам нужно будет выполнить следующие команды, прежде чем вы сможете упаковать свое приложение для iOS на вашем Mac:

$ 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 в Python. Эта команда должна исправить это:

$ cd /Applications/Python\ 3.7/
$ ./Install\ Certificates.command

Теперь вернитесь и попробуйте toolchainснова выполнить команду.

После того, как вы успешно выполнили все предыдущие команды, вы можете создать свой проект XCode, используя toolchainскрипт. Точка входа вашего основного приложения должна быть названа main.pyперед созданием проекта XCode. Вот команда, которую вы запустите:

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

Там должен быть каталог с именем titleвашего проекта Xcode в нем. Теперь вы можете открыть этот проект в Xcode и работать над ним оттуда. Обратите внимание: если вы хотите подать заявку в App Store, вам нужно будет создать учетную запись разработчика на developer.apple.com и оплатить ее ежегодную плату.

Упаковка вашего приложения для Windows

Вы можете упаковать свое приложение Kivy для Windows, используя PyInstaller. Если вы никогда не использовали его раньше, ознакомьтесь с разделом Использование PyInstaller для простого распространения приложений Python .

Вы можете установить PyInstaller, используя pip:

$ pip install pyinstaller

Следующая команда упакует ваше приложение:

$ pyinstaller main.py -w

Эта команда создаст исполняемый файл Windows и несколько других файлов. -wАргумент говорит PyInstaller , что это оконное приложение, а не приложение командной строки. Если вы хотите, чтобы PyInstaller создавал один исполняемый файл, вы можете передать --onefileаргумент в дополнение к -w.

Упаковка вашего приложения для macOS

Вы можете использовать PyInstaller для создания исполняемого файла Mac, как вы это делали для Windows. Единственное требование – вы должны запустить эту команду на Mac:

$ pyinstaller main.py -w --onefile

Это создаст один исполняемый файл в distпапке. Исполняемый файл будет иметь то же имя, что и файл Python, который вы передали PyInstaller. Если вы хотите уменьшить размер файла исполняемого файла или используете GStreamer в своем приложении, то посетите страницу упаковки Kivy для macOS для получения дополнительной информации.

Вывод

Kivy – это действительно интересный графический интерфейс, который вы можете использовать для создания пользовательских интерфейсов и мобильных приложений для настольных компьютеров как на iOS, так и на Android. Приложения Kivy не будут выглядеть как родные приложения на любой платформе. Это может быть преимуществом, если вы хотите, чтобы ваше приложение выглядело и отличалось от конкурентов!

В этом руководстве вы изучили основы Kivy, в том числе способы добавления виджетов, подключения событий, размещения нескольких виджетов и использования языка KV. Затем вы создали свое первое приложение Kivy и узнали, как его распространять на другие платформы, включая мобильные!

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

Дальнейшее чтение

Чтобы узнать больше о Kivy, ознакомьтесь с этими ресурсами:

Чтобы увидеть, как вы можете создать настольное приложение с другой структурой Python GUI, ознакомьтесь с разделом Как создать приложение Python GUI с помощью wxPython .


Совершенствуй знания каждый день у нас в Телеграм-каналах

Вопросы, реклама — VK | Telegram