Существуют несколько фреймворков для создания мобильных приложений на Python, но наиболее популярными являются Kivy и BeeWare. В этой статье мы рассмотрим процесс создания простого приложения на Android с использованием Kivy.
Установка необходимого ПО
- Python 3.6 или новее
- Kivy
- Buildozer
Создание приложения на Kivy
Сначала вам нужно написать приложение на Kivy. Вот пример простого приложения:
from kivy.app import App from kivy.uix.button import Button class MyApp(App): def build(self): return Button(text=’Hello World’) if __name__ == ‘__main__’: MyApp().run()
Конфигурация Buildozer
Теперь, когда у вас есть приложение, вам нужно настроить Buildozer. Для этого создайте файл buildozer.spec в той же директории, что и ваше приложение, и добавьте следующий код:
[app] # (str) Title of your application title = My Application # (str) Package name package.name = myapp # (str) Package domain (needed for android/ios packaging) package.domain = org.test # (str) Source code where the main.py live source.dir = . # (str) Source code entry point (file to execute) source.main = main.py # (str) List of directory to exclude (let a empty list to mean all) source.exclude_dirs = # (str) List of extensions to exclude (let a empty list to mean all) source.exclude_ext = # (str) List of directory where the .pyo / .so must be copied (let a empty list to mean all) source.include_exts = [buildozer] # (int) Log level (0 = error only, 1 = info, 2 = debug (with command output)) log_level = 2
Сборка приложения
Теперь вы готовы собрать свое приложение. Для этого просто выполните следующую команду в терминале:
Как создать мобильное приложение на Python #1
buildozer android debug
После завершения сборки у вас поя
вится файл .apk, который можно установить на устройство с Android.
Отправка приложения на устройство
Чтобы установить приложение на свой Android-смартфон, выполните следующие шаги:
- Подключите смартфон к компьютеру через USB.
- Включите режим разработчика и разрешите установку приложений из неизвестных источников на своем смартфоне.
- Перенесите файл .apk на свой смартфон.
- Откройте файл .apk на своем смартфоне, чтобы установить приложение.
Поздравляем! Вы только что создали и установили свое первое приложение на Android, написанное на Python.
Заключение
Python, несмотря на то, что он не является традиционным выбором для разработки мобильных приложений, все же может быть очень полезным инструментом, особенно если вы уже знакомы с этим языком. С помощью Kivy и Buildozer вы можете создать кросс-платформенные приложения, которые будут работать как на Android, так и на iOS.
- Получить ссылку
- Электронная почта
- Другие приложения
Как сделать шашки на python
Как сделать шашки на Python Как сделать шашки на Python В этой статье мы рассмотрим, как создать простую игру в шашки на Python с использованием библиотеки Pygame. Подготовка Для начала установите библиотеку Pygame, используя следующую команду: pip install pygame Создание доски import pygame pygame.init() WIDTH, HEIGHT = 800, 800 ROWS, COLS = 8, 8 SQUARE_SIZE = WIDTH // COLS WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) BLUE = (0, 0, 255) def draw_board(win): win.fill(WHITE) for row in range(ROWS): for col in range(row % 2, COLS, 2): pygame.draw.rect(win, BLACK, (row * SQUARE_SIZE, col * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE)) def main(): win = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption(«Checkers») clock = pygame.time.Clock() run = True while run: clock.tick(60) for event in pygame.event.get(): if event.ty
СОЗДАНИЕ ANDROID ПРИЛОЖЕНИЯ на PYTHON | KIVY
Метод штрафных функций python
Метод штрафных функций Python Метод штрафных функций Python Метод штрафных функций является одним из способов оптимизации функций с ограничениями. В этой статье будет рассмотрен пример использования метода штрафных функций на языке программирования Python. Основы метода штрафных функций Метод штрафных функций предполагает замену задачи с ограничениями на эквивалентную задачу без ограничений. Для этого к целевой функции добавляется штрафной член, который штрафует недопустимые решения, делая их менее предпочтительными для оптимизации. Пример использования метода штрафных функций в Python Рассмотрим пример оптимизации функции с ограничениями с помощью метода штрафных функций на Python. Задача: минимизировать функцию f(x) = x^2 с ограничением g(x) = x — 2 >= 0 . import numpy as np from scipy.optimize import minimize def f(x): return x**2 def g(x): return x — 2 def penalty_function(x, r): return f(x) + r * np.maximum(-g(
Typescript ассоциативный массив
Узнай все о Typescript ассоциативных массивах! Используй интерфейс Record, чтобы определить типы ключей и значений, и храни данные со сложным или динамическим ключем! Typescript Associative Array В Typescript, ассоциативные массивы могут быть определены с помощью интерфейса Record . Этот интерфейс позволяет задать тип ключей и значений в массиве. interface Record < [key: string]: any; >const myArray: Record = <>; myArray[«key1»] = «value1»; myArray[«key2»] = 2; В данном примере, мы определяем интерфейс Record , который позволяет использовать любые строковые ключи с любыми значениями. Затем мы создаем переменную myArray , которая использует этот интерфейс, и добавляем в нее два элемента. Также можно определять типы для ключей и значений, чтобы быть уверенным в том, что в массиве будут только определенные типы данных. interface Record < [key: string]
Источник: www.articleshub.net
Разработка мобильных приложений на Python. Библиотека KivyMD
Разработка мобильных приложений на Python. Библиотека KivyMD
Приветствую! Сегодня речь снова пойдет о библиотеке KivyMD — наборе виджетов для кроссплатформенной разработки на Python в стиле Material Design. Что-то похожего на туториал по разработке мобильных приложений на Python для новичков здесь не будет, так что если впервые слышите о фреймворке Kivy, вряд ли вам будет все это интересно. Ну, а мы погнали под кат!
На днях скачал из Google Play демонстрационное приложение Flutter UIKit:
И сейчас мы с вами попробуем повторить один экран из этого приложения. Давайте сразу посмотрим на результаты: слева — Flutter, справа — Kivy RelativeLayout —> FloatLayout.
Все виджеты во FloatLayout позиционируются от нижнего левого угла, то есть, на экране им автоматически присваивается позиция (0, 0). В разметке не сложно проследить порядок добавления элементов на экран сверху вниз:
Если кто-то обратил внимание, то позицию мы указали только одному виджету:
MDToolbar: . pos_hint:
Каждому виджету в Kivy помимо конкретных координат (x, y) можно указать подсказку позиции:
pos_hint: # верхняя граница экрана pos_hint: # нижняя граница экрана pos_hint: # правая граница экрана pos_hint: # центр экрана по вертикали pos_hint: # отступ в 20 % по горизонтали от левой границы экрана . .
Так вот, нижнее фоновое изображение…
BoxLayout: size_hint_y: None height: root.height — toolbar.height FitImage: source: «smokestackheather.jpeg»
… благодаря виджету FitImage (библиотека KivyMD), автоматически растягивается на все выделенное ему пространство с сохранением пропорций изображения:
По умолчанию каждому виджету и лайоуту в Kivy предоставляется 100 % пространства, если не указанно иное. Например, если вы захотите добавить на экран одну кнопку, вы, очевидно сделаете следующее:
from kivy.app import App from kivy.lang import Builder KV = «»» Button: text: «Button» «»» class MyApp(App): def build(self): return Builder.load_string(KV) MyApp().run()
И получите результат:
Кнопка заняла 100 % пространства. Чтобы разместить кнопку по центру экрана, нужно, во-первых, задать ей необходимый размер и, во-вторых, указать, где она будет находится:
from kivy.app import App from kivy.lang import Builder KV = «»» Button: text: «Button» size_hint: None, None size: 100, 50 pos_hint: «»» class MyApp(App): def build(self): return Builder.load_string(KV) MyApp().run()
Теперь картина изменилась:
Также можно указать свойство size_hint, от 0 до 1, (эквивалент 0-100%), то есть, подсказка размера:
from kivy.app import App from kivy.lang import Builder KV = «»» BoxLayout: Button: text: «Button» size_hint_y: .2 Button: text: «Button» size_hint_y: .1 Button: text: «Button» «»» class MyApp(App): def build(self): return Builder.load_string(KV) MyApp().run()
Или тоже самое, но подсказка ширины (size_hint_x):
from kivy.app import App from kivy.lang import Builder KV = «»» BoxLayout: Button: text: «Button» size_hint_x: .2 Button: text: «Button» size_hint_x: .1 Button: text: «Button» «»» class MyApp(App): def build(self): return Builder.load_string(KV) MyApp().run()
MDToolbar имеет высоту в 56dp, не может занимать все пространство, и если ему не подсказать, что его место сверху, то он автоматически прилипнет к нижней части экрана:
Список карточек — OrderProductLayout (о нем мы поговорим ниже) — это ScrollView с элементами MDCard и он занимает всю высоту экрана, но благодаря padding (значения отступов в лайоутах) кажется, что он находится чуть выше центра экрана. Ну а MDBottomAppBar по умолчанию кидает якорь к нижней границе экрана. Поэтому только MDToolbar мы указали, где его место.
Теперь давайте посмотрим, что представляет из себя виджет OrderProductLayout:
Как видим, это четыре карточки, вложенные в ScrillView. В отличие от родительского экрана, который унаследован от FloatLayout, здесь все виджеты читаются сверху вниз.
Это очень удобно, поскольку прослеживается четкая иерархия виджетов, древовидная структура и с одного взгляда понятно, какой виджет/контролл какому лайоуту принадлежит. В Kivy наиболее частым используемым лайоутом является BoxLayout — коробка, которая позволяет размещать в себе виджеты по вертикали либо по горизонтали (по умолчанию — последнее):
Более наглядно это видно из следующей схемы, где используется BoxLayout горизонтальной ориентации:
Приложение на Android. Python. KivyMD
Раньше я уже писал, что написал для себя полноценное десктопное приложение-менеджер заметок на Python+PyQT5, и в конце намекал на то, что надо бы его «портировать» на Android.
И даже был скрин первого прототипа. Однако, учитывая, что у меня был ужасно слабый (даже для своего времени) ноутбук 2011 года, на котором Android Studio запускалось около 10 минут и ровно столько же билдило приложение. А процесс редактирования был долгим и унылым в силу мощности ноутбука.
Плюс, мне, как для человека, немного разобравшимся с «python for pc», было тяжеловато перейти на разработку под Android. Сама Java, в принципе, вопросов не вызывала, но именно андроид-логика (всякие активити, интенты, передачи из одного окна в другое и получение, и прочее) были для меня тогда ужасно сложным занятием.
Потом мы с другом надумали попробовать на Kotlin (а он тогда только набирал популярность), вроде полегче должно быть. Потом вообще решили переделать полностью, делать типа как веб приложение, хранящие данные в json. Все ради постоянной синхронизации а-ля «Google Keep».
Вариантов было куча.
Но как-то не срослось, к последними я даже не стал приступать. Все-таки мне интересен Python сам по себе. И его универсальность) Вот я и решил проверить эту самую универсальность, и, собственно, себя тоже. Так как это дело было для меня в новинку.
Итак. Есть замечательный фреймворк, который называется Kivy. На их официальном сайте есть документация. Суть в том, что он позволяет писать на Python приложения на другие платформы, в том числе и Android.
И я решил к этому делу приобщиться. Единственное, что смущало — интерфейс. Интерфейс на Kivy уж очень похож на приложения времен Android 4.1(примерно 2012 года).
К примеру , вот демонстрация виджетов.
Свою работу, они, конечно выполняют. Работают на андроиде «нативно». Но. Некрасиво же. 2020 год заканчивается.
Android 11 вышел. Концепция Material Design в ходу уже во всем Интернете.
К счастью, решение нашлось. (Много?)страдальный форк библиотеки Kivy, который базируется на ней же, но переделывает ее в современный вид. Как на странно, называется KivyMD (Kivy Material Design). Статьи по ней легко находятся в Интернете. Также у нее вполне понятная документация.
К примеру, так выглядит боковая панель, как в Google Play:
Впечатлившись этим действием, я начал делать первые попытки.
Стоит признать, что не все прошло гладко. Программирование на Kivy состоит из 2 вещей: логика в Python-файле и интерфейс (разметка) в kv-файле. Я же, по привычке, делал все через код. Все, что мог. 90% находится в коде. Впрочем, я ж не на продакшн работаю — для себя) Какая мне разница, лишь бы работало.
Моей задачей было максимально быстро перенести программу.
Установив на компьютер все необходимые компоненты, я начал потихоньку все это писать. Основная проблема было лишь правильно указать все зависимости в spec-файле для билдера и настроить виртуалку (для компиляции apk нужен linux). В итоге, вот что из этого получилось.
Каждый раздел находится в отдельном окне, переключение между которыми идет через боковое меню. Каждый экран имеет соответствующие вкладки:
Конечно, боковуха пока довольно некрасива, но пока что я не уделял внимание дизайну, только работоспособности:
При нажатии на имя заметки открывается ее содердимое:
Чекбокс нужен для изменения содержимого заметки:
Ну а в меню архивации собственно есть возможность управления локальными и онлайн-бекапами, все как в десктопной версии:
Вся прелесть в том, что это — все еще код на Python. Т.е. это — идеальный вариант, когда есть готовая программа. Вы просто берете всю свою логику и переносите практически 1 в 1, делая поправку на переписанный интерфейс. Половина работы скошена =)
Например, вот код получения списка всех заметок в папке на PyQT5:
# Функция получения списка всех песен def all_songs_getnames(self, QWidget, path): self.path = path self.object = QWidget self.object.clear() for currentFile in self.path.iterdir(): name = os.path.split(currentFile) # разделение пути на адрес и имя файла base = name[1] # присвоение base имя файла os.path.splitext(base) # делю остаток на 2 части, отсеиваю расширение с точкой filename = os.path.splitext(base)[0] # вот и само имя self.object.addItem(filename)
А вот точно такой же код, только из KivyMD-версии:
def notes_getnames(self, path, widget, iconname): # удаляем старые widget.clear_widgets() # перебираем все файлы и заносим названия в self.list for currentFile in path.iterdir(): name = os.path.split(currentFile) # разделение пути на адрес и имя файла base = name[1] # присвоение base имя файла os.path.splitext(base) # делю остаток на 2 части, отсеиваю расширение с точкой filename = os.path.splitext(base)[0] # вот и само имя item = ListItemWithRadiobutton(text=filename, icon=iconname) item.on_release = partial(self.showtext, path, filename) widget.add_widget(item)
Конечно, еще есть что допиливать, но главный вывод: python+android=alive!
Источник: eretick01.wixsite.com