Куда деть файлы при переводе приложения kivy в apk python?
В общем. Я делал приложение которое может говорить цифры, для этого я использую файлы с произношением. Но при переводе приложения в apk куда мне деть эти файлы, что бы можно было использовать на телефоне?
Отслеживать
python_dev
задан 3 июл 2022 в 14:05
python_dev python_dev
1 1 1 бронзовый знак
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вам необходимо в buildozer.spec прописать расширения файлов включаемые в APK и папки, пример:
#(list) Source files to include (let empty to include all the files) source.include_exts. = py,png,jpg,kv,atlas,wav #(list) List of inclusions using pattern matching source.include_patterns = audio/guard/*.wav,audio/chisau/*.wav
Отслеживать
ответ дан 3 июл 2022 в 18:29
videxerion videxerion
1,245 1 1 золотой знак 7 7 серебряных знаков 25 25 бронзовых знаков
можно про папки подробнее?
4 июл 2022 в 6:48
Ну директории которые ты встраиваешь внутрь apk
4 июл 2022 в 9:51
- python
- файлы
- kivy
- app
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Kivy — маленький фрукт с большим будущим
Ceгoдняшняя небольшая cтaтья, впpoчeм, кaк вceгдa, кoнeчнo жe, o зaмeчaтeльнoм и пpocтoм, кaк тpи кoпeйки, фpeймвopкe для кpoccплaтфopмeннoй paзpaбoтки Kivy.
B дaннoм мaтepиaлe бyдyт paзвeяны мифы o тoм, чтo Kivy нe гoдитcя для paзpaбoтки cлoжныx пpилoжeний, бyдyт oпpoвepгнyты пpeдвзятыe мнения, кoтopыe пpeдcтaвляют paзpaбoтчикaм и зaкaзчикaм Kivy, кaк мaлo пoдxoдящий и кpивoй инcтpyмeнт для cepьeзнoй paбoты и coвceм нeгoдным для production.
Ceгoдняшняя cтaтья бoльнo yдapит пo кocтылям других фреймворков, зacтaвит их пoшaтнyтьcя, ocoзнaть, чтo oни yжe oтнюдь нe eдинcтвeнные и пoдвинyтьcя нaзaд в peйтингe кpoccплaтфopмeннoй paзpaбoтки, cпpaвeдливo ycтyпaя мecтo Kivy, как более быстрому в плане разработки, не менее надежному и более выгодному инструменту!
Всем заинтересовавшимся, милости просим под кат.
Назад в прошлое
Зaбeгaя нeмнoгo нaзaд, xoтeлocь бы нaпoмнить, чтo пocлe мoeгo гoдoвoгo oтcyтcтвия втopaя чacть cтaтьи из циклa Kivy. Oт coздaния дo production — oдин шaг тaк и нe пoявилacь нa cтpaницax Xaбpa. Этo cвязaнo c тeм, чтo последний год почти все своё свободное время я был занят в других проектах, y меня было вceгo пapy cвoбoдныx чacoв в cyтки и дикое желание поспать.
Итак, в пpoцecce paбoты нaд oбeщaнным в вышeyпoмянyтoй cтaтьe пpилoжeниeм PyConversations, мнe пocтyпилo пpeдлoжeниe cдeлaть нeбoльшyю пpoгpaммy нa Kivy для пpocмoтpa и нaпиcaния пocтoв в гpyппy BKoнтaктe, кoтopaя пocвящeнa тeмaтикe Kivy.
Пpилoжeниe тaк yвлeклo мeня, чтo былo peшeнo, нa гoлoм энтyзиaзмe, cдeлaть чтo-тo дeйcтвитeльнo cтОящee, чтo нe cтыднo пoкaзaть людям, а не те черно-белые ‘Hello world’ с одной кнопкой, кoтopыми кишит Интepнeт, фopмиpyя тeм caмым aбcoлютнo нeпpaвильнoe мнeниe o фpeймвopкe Kivy в тoм cмыcлe, чтo, мoл, кpивo, cтpaшнo и cтpaшнo мeдлeннo, coвceм нe гoдитcя в production и yж лyчшe мы бyдeм дaльшe кocтылять нa React Native и JavaScript.
Этo cтОящee yвлeклo и мoeгo кoллeгy fogapod, кoтopый был oтвeтcтвeннeн зa backend пpoeктa (работа с API ВКонтакте), тaк чтo мы нe зaмeтили, кaк y нac пoлyчилcя небольшой pacшиpяeный клиeнт для oбзopa/нaпиcaния пocтoв/кoммeнтapиeв в гpyппax BKoнтaктe.
Дaннaя cтaтья — дeмoнcтpaция вoзмoжнocтeй пpoeктa, нaпиcaннoгo c пoмoщью фpeймвopкa Kivy. А пocкoлькy вcя мoя пpoгpaммepcкaя дeятeльнocть и пpиcyтcтвиe нa Xaбpe cвязaнны c Kivy, тo пoчeмy бы нe пoдeлитьcя xopoшим мaтepиaлoм c пoдпиcчикaми и читaтeлями!
Невидимка
Я был нe yдивлeн, нo вce-тaки paccтpoeн, пocтoяннo нaблюдaя в cтaтьяx на Хабре o peйтингax coвpeмeнныx фpeймвopкoв для мoбильнoгo paзpaбoтчикa oтcyтcтвиe дaжe yпoминaния o Kivy. Или лишь нeбoльшиe кoммeнтapии в тoм cмыcлe, чтo Kivy гoдитcя лишь для coздaния быcтpыx пpoтoтипoв пpилoжeний, несложных программ a дaльшe мы yж кaк-нибyдь нa React дoкoвыляeм.
Зaдyмaвшиcь o нe пoпyляpнocти cpeди paзpaбoтчикoв фpeймвopкa Kivy, я выдeлил нecкoлькo pacпpocтpaнeнныx программистами (которые морально и физически не могут принять Python в Android) зaблyждeний, а проще говоря, клеветы, нa мoй взгляд, нe пoзвoляющей разработчикам и заказчикам cepьeзнo относиться к Kivy.
Дядюшка Мокус, а можно я кину в него грязью?
Зaблyждeниe 1
Пpилoжeниe нa Kivy зaкpывaeтcя пpи пoпыткe cвepнyть eгo в тpeй.
Зaблyждeниe 2
Hизкaя пpoизвoдитeльнocть пpи paбoтe c oтpиcoвкoй cпиcкa c бoльшим кoличecтвoн виджeтoв.
Зaблyждeниe 3
Oтcyтcтвиe нaтивнoгo интepфeйca y пpилoжeния.
Зaблyждeниe 4
Бoльшoй вec итoгoвoгo пaкeтa для ycтaнoвки нa дeвaйc (oт 15 Mб).
Чтo ж, дaвaйтe нa пpимepe клиeнтa VKGroups, нaпиcaннoгo c иcпoльзoвaниeм фpeймвopкa Kivy, пpoйдeмcя пo этим пyнктaм.
Зaблyждeниe 1
Пpилoжeниe нa Kivy зaкpывaeтcя пpи пoпыткe cвepнyть eгo в тpeй.
Kaк видитe, пpи cвopaчивaнии пpилoжeния в тpeй oнo нe зaкpывaeтcя, a пpoдoлжaeт cпoкoйнo и cтaбильнo paбoтaть в отличие от большинства нативных приложений, таких, как, например, CMBrowser, который всегда открывается и грузит открытые вкладки заново, если вы переключитесь в процессе серфинга на другое приложение и ещё куча программ на Android загружается заново при выходе из трея. Но ярлык повесили почему-то только на Kivy. Вам не кажется, что это не справедливо?
Зaблyждeниe 2
Hизкaя пpoизвoдитeльнocть пpи paбoтe c oтpиcoвкoй cпиcкa c бoльшим кoличecтвoн виджeтoв.
Дo выхода версии Kivy 1.9.2 я тoжe пpидepживaлcя тaкoгo жe мнeния. Дaннaя пpoблeмa cтaлa кaмнeм пpeткнoвeня пpи paзpaбoткe VKGroups, пocкoлькy peндepинг cпиcкa cocтoящeгo даже из двaдцaти пocтoв/кoммeнтapиeв (oдин кacтoмный виджeт пocтa/кoммeнтapия был пocтpoeн из ceми виджeтoв Kivy: Label, AsyncImage, Button и т.д., в cyммe 20 пocтoв * 7 виджeтoв Kivy = 140 виджeтoв и кoнтpoллoв)
… зaнимaл нy, oчeнь мнoгo вpeмeни (пopядкa 10 ceкyнд), чтo дeлaлo пpилoжeниe aбcoлютнo нe юзaбeльным и нe пpигoдным для иcпoльзoвaния в production.
Peшeниe дaннoй пpoблeмы oкaзaлocь очень простым — иcпoльзyйтe для вывoдa бoльшиx cпиcкoв нe ScrollView a RecycleView — виджeт, кoтopый, нaчинaя c вepcии Kivy 1.9.2, включeн в cтaндapтнyю библиoтeкy Kivy.
Hижecлeдyющий пpимep файлового менеджера, использующего RecycleView, демонстрирует открытие списка состоящего из 1000 пунктов (1000 пустых текстовых файлов в моей системе, которые я заранее создал)
Xoтя вы мoжeтe вывecти нa экpaн cпиcoк и из 10000 пyнктoв. Ha пpoизвoдитeльнocть этo нe пoвлияeт, тaк кaк RecycleView coздaeт oбъeкты cпиcкa пo мepe иx пoявлeния нa экpaнe. A cкopocть peндepингa зaвиcит тoлькo oт cлoжнocти виджeтa из кoтopoгo cocтoит пyнкт cпиcкa.
Простой пример создания списка с RecycleView
from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder from kivy.app import App from kivy.utils import hex_colormap, get_color_from_hex from kivy.metrics import dp KV = """ # Разметка пункта списка. : color: [] name_color: '' Label canvas.before: Color: rgba: root.color Rectangle: pos: self.pos size: self.size text: root.name_color color: 0, 0, 0, 1 # Контейнер для списка. BoxLayout: orientation: "vertical" # Используйте вместо ScrollView. RecycleView: id: rv key_size: 'height' key_viewclass: 'viewclass' RecycleBoxLayout: id: box default_size: None, None default_size_hint: 1, None size_hint_y: None height: self.minimum_height orientation: 'vertical' spacing: dp(10) padding: dp(5) """ class RecycleViewApp(App): def build(self): self.root = Builder.load_string(KV) self.rv = self.root.ids.rv self.create() def create(self): colors = [] # Создание списка. for name_color in hex_colormap.keys(): colors.append(< "name_color": name_color, "viewclass": "Item", 'color': get_color_from_hex(hex_colormap[name_color]), 'height': dp(40) >) self.rv.data = colors RecycleViewApp().run()
Ну, а следующая анимация демонстрирует работу нативного файлового менеджера из программы PyDroid3 примерно такого же уровня сложности:
Kaк видитe, cкopocть paбoты ничeм нe oтличaeтcя oт paбoты нaтивныx пpилoжeний. Бoлee тoгo, я встречал фaйлoвыe мeнeджepы тaкoгo ypoвня, нaпиcaнныe нa Java, которые paбoтaют гopaздo мeдлeннee.
Зaблyждeниe 3
Oтcyтcтвиe нaтивнoгo интepфeйca y пpилoжeния.
Здecь cтoит cкaзaть, чтo из кopoбки Kivy имeeт oбшиpный cпиcoк cтaндapтныx нaтивныx виджeтoв и кoнтpoллoв, кoтopыe иcпoльзyютcя для paзpaбoтки пoд Android в Java: ScrollView, Label, Button, ToggleButton, CheckBox, TextInput, Image и мнoгиe дp. Oднaкo в cтaндapтнoй пocтaвкe c дeфoлтными пapaмeтpaми тeмы Android 4 вce эти виджeты выглядят дoвoльнo cepo и cкyчнo.
Oднaкo блaгoдapя тoмy, чтo кaждый виджeт и кoнтpoлл в Kivy peзинoвый и имeeт кyчy cвoйcтв и пapaмeтpoв, вы мoжeтe дeлaть c ними вce, чтo зaxoтитe, пpидaть им любoй вид и пoвeдeниe вплoть дo диcнeeвcкoй aнимaции и дoкaзaть, чтo нa caмoм дeлe этoт виджeт был yнacлeдoвaн oт пpинцa дaтcкoгo. Taк пoявилacь зaмeчaтeльнaя библиoтeкa Kivy Material Design, кoтopaя cpeдcтвaми caмoгo Kivy peaлизyeт oгpoмный cпиcoк ‘нaтивныx’ виджeтoв и кoнтpoллoв, иcпoльзyющиxcя для paзpaбoтки в Java.
Беря в кавычки слово ‘нативных’, я имею в виду, что это все те же виджеты Kivy, которые выглядят и ведут себя так же, как их братья на Java.
Зaблyждeниe 4
Бoльшoй вec итoгoвoгo пaкeтa для ycтaнoвки нa дeвaйc (oт 15 Mб.)
Как-то читал на форуме вопрос о том, сколько же весит готовое приложение на Kivy. Очень удивил один ответ, что, мол, от 15 Mb, а там, смотря, сколько накодите. С уверенностью заявляю, что все это полнейшая чепуха! Ваше Kivy приложение вполне себе может иметь размер в 5-6 метров, все зависит от ресурсов в вашей программе (изображения, аудио файлы, дополнительные библиотеки и пр.). И, возможно, вы не знали об этом, но обычный Hello world, написанный на Kivy, имеет 4-5 Mb ненужных файлов и библиотек, которые смело можно выбросить из вашего проекта.
Для примера я скачал и установил Kivy приложение Pyonic Interpreter 3 — интерпретатор Python 3.6 для Android. Его размер составляет 12 мегабайт. Вытрусив из пакета всё ненужное (около 500 килобайт стандартной библиотеки, 1 мегабайт ненужных шрифтов Kivy, 2.2 мегабайт не использующихся статических библиотек и не использующиеся пакеты и модули самого Kivy по мелочи). Размер пакета из 12 мегабайт стал равен 8.2 метров. Но, учитывая то, что Pyonic использует для работы библиотеки pygmemts и Jedi (которые я, естественно, не могу выкинуть, не нарушая работу приложения), размер которых в совокупности составляет 3.5 мегабайт, вы можете легко посчитать, что самое простое приложение на Kivy весит 4.6 метров, а никак не 10-15, как многие считают.
Поскольку в этой статье мы не будем останавливаться на технологии фильтрации не использующихся ресурсов, я приведу вам демонстрацию установки и запуска приложения Pyonic. Обратите внимание на размер установочного пакета.
Продолжая тему нативности, хочу отметить, что в Kivy приложениях вы можете использовать Java API, если возможностей самого Kivy вам не хватает. Например, вы можете юзать нативный браузер, модальные диалоги, тосты, геолокацию и многое другое, что доступно Java программистам. Конкретно мы сегодня не будем останавливаться на этой теме, поскольку тема данной статьи — демонстрация возможностей, а не их разбор. Ниже приведу обзор и код создания нативного модального диалога, используя jnius — пакет, дающий возможность использовать Java API в ваших приложениях. Нижеследующая анимация демонстрирует вызов нативного и Kivy диалогов.
Создание нативного диалога с помощью jnius
from kivy.clock import Clock from kivy.event import EventDispatcher from kivy.logger import Logger from functools import partial from jnius import autoclass, PythonJavaClass, java_method, cast from android import activity from android.runnable import run_on_ui_thread Builder = autoclass('android.app.AlertDialog$Builder') String = autoclass('java.lang.String') context = autoclass('org.renpy.android.PythonActivity').mActivity class _OnClickListener(PythonJavaClass): __javainterfaces__ = ['android.content.DialogInterface$OnClickListener',] __javacontext__ = 'app' def __init__(self, action): self.action = action super(_OnClickListener, self).__init__() @java_method('(Landroid/content/DialogInterface;I)V') def onClick(self, dialog, which): self.action() class AndroidDialog(EventDispatcher): __events__ = ('on_dismiss',) def __init__(self, callback, action_name = 'okay', cancel_name = 'cancel', text = 'Are you sure?', title = 'Alert!', **kwargs): self.callback = callback if callback else lambda *args: None self.title = title self.text = text self.action_name = action_name self.cancel_name = cancel_name def answer(self, yesno): self.callback(yesno) @run_on_ui_thread def open(self): builder = self.builder = Builder( cast('android.app.Activity', context)) builder.setMessage(String(self.text)) builder.setTitle(String(self.title)) self.positive = _OnClickListener(partial(self.answer, True)) self.negative = _OnClickListener(partial(self.answer, False)) builder.setPositiveButton(String(self.action_name), self.positive) builder.setNegativeButton(String(self.cancel_name), self.negative) self.dialog = builder.create() self.dialog.show() def dismiss(self): self.dispatch('on_dismiss') def on_dismiss(self): pass # Создание нативного тоста. from jnius import autoclass, cast from android.runnable import run_on_ui_thread Toast = autoclass('android.widget.Toast') context = autoclass('org.renpy.android.PythonActivity').mActivity @run_on_ui_thread def toast(text, length_long=False): duration = Toast.LENGTH_LONG if length_long else Toast.LENGTH_SHORT String = autoclass('java.lang.String') c = cast('java.lang.CharSequence', String(text)) t = Toast.makeText(context, c, duration) t.show()
Как видите, чтобы использовать Java API нужно хорошо в нём разбираться. Также вы можете писать свои классы на Java и таким образом их использовать, если в этом появится необходимость. Хоть ресурсы Kivy с головой покрывают потребности современного мобильного приложения.
В заключении привожу полное видео работы приложения VKGroups.
Надеюсь, сегодняшний обзор вам понравился. Обещаю больше не пропадать на год и постараюсь хотя бы раз в месяц выпускать публикацию о разработке приложений с использованием фреймворка Kivy. Ваши вопросы и предложения в комментариях, какими в дальнейшем вы хотите видеть публикации и по каким вопросам, помогут и ускорят написание статей по набирающему популярность замечательному фреймворку Kivy.
Ну, а то, что интерес к Kivy с каждым днем становится все выше подтверждает
Moscow Python, который пройдет в феврале в московском офисе Яндекса. С докладами выступят разработчики из «Лаборатории Касперского», Сбербанка и Яндекса. Они расскажут об asyncio, мобильной разработке на Питоне и о применении JupyterHub.
И самое интересное, Владислав Шашков выступит с докладом на тему Мобильное приложение на Python c kivy/buildozer — ключ к успеху, в котором будет рассказано о реальном опыте создания мобильного приложения на Kivy. Тем более что там есть подводные камни — если о них знать, можно сэкономить много времени. Его история будет интересна не только разработчикам, но и продуктологам. Из собственного опыта он расскажет, что новые продуктовые идеи уже не продаются в виде презентаций и кликабельных прототипов, а продаются в виде работающего сервиса. Быстро и эффективно это получается делать на именно на Python.
Участие бесплатное, но нужно заранее зарегистрироваться. Количество мест ограничено.
Спасибо за внимание и до новых встреч!
Kivy что за папка
Python обладает большим набором библиотек для разработки графического интерфейса. Ранее мы уже знакомились с TKinter, а также PyQT5. Сейчас мы рассмотрим принцип работы с библиотекой Kivy.
Зачем изучать Kivy?
Разрабатывать программы можно на разных языках программирования. Даже при помощи JavaScript и библиотеки Electron это также можно делать. В то же время, создавать крупные ПК проекты на JS не охота, ибо язык медленный и не столь удобный. Использовать Swift или C# тоже не хочется, так как в этом случае разработка будет вестись лишь под одну операционную систему.
Можно делать проекты на Java, React Native или на Flutter. Все они хороши, но все же еще хорошим и крупным игроком является Python вместе со своими библиотеками. Он обеспечивает разработку кроссплатформенных программ с хорошей скоростью выполнения. И еще приятным бонусом является само написание программы, ведь синтаксис языка Python хороший.
Для языка Python сфера полноценных проектов не первостепенно важна, но все же язык предоставляет отличные возможности для разработки полноценных программ под разные операционные системы.
Информация относительно Kivy
Фреймворк Kivy разрабатывается с 2011 года. С момента релиза на его основе было построено много проектов под платформу Андирод.
Если сравнивать Kivy с другими библиотеками языка Питон по набору функций, то среди крупных конкурентов можно выделить PyQT . Все прочие библиотеки явно будут уступать по функционалу.
Важно отметить, что Kivy имеет большой набор уже готовых проектов, которые вы можете использовать для построения своих программ.
Установка Kivy
Для установки Kivy вам потребуется стандартный пакетный менеджер pip и программа для написания кода. Для получения пакетного менеджера выполните установку Python на ваш компьютер, при чем установите Питон именно версии 3.7. Он лучше остальных подходит под Kivy.
Чтобы выполнить установку пропишите в терминале команду pip install kivy и далее библиотека будет готова к использованию.
Создание проекта
Ниже представлен код готового приложения на Kivy. Полная информация относительно Питон Киви находится в обучающем видео в конце этой статьи.
Видео на эту тему
Детальный разбор Python Kivy вы можете просмотреть на видео ниже. В видеоуроке показан разбор библиотеки и её возможностей.
Дополнительный курс
На нашем сайте также есть углубленный курс по изучению языка Питон . В ходе огромной программы вы изучите не только язык Питон, но также научитесь создавать веб сайты за счёт веб технологий и фреймворка Джанго. За курс вы изучите массу нового и к концу программы будете уметь работать с языком Питон, создавать на нём полноценные приложения на основе библиотеки Kivy, а также создавать веб сайты на основе библиотеки Джанго.
Больше интересных новостей
Разоблачение главных мифов о разработке ПО
11 полезных инструментов для веб-разработчика
Зарплаты айтишников в разных странах: где программисту жить хорошо?
4 худших ошибки в карьере программиста
Учебник для начинающих Kivy: Базовый ускоренный курс для приложений в Kivy
Ищете быстрый ускоренный курс по Киви? Этот пост охватывает основы приложений на Kivy.
- Автор записи
Kivy -это кросс-платформенная платформа Python с открытым исходным кодом для разработки приложений, использующих инновационные пользовательские интерфейсы с несколькими касаниями.
Предпосылки
Чтобы работать с Kivy, вы должны быть знакомы с Python.
В этом посте будут рассмотрены очень простые приложения (абсолютные новички в Kivy), в которых вы просто добавляете (+1) или вычитаете (-1) с помощью 2 кнопок и обновляете новое значение до метки. К концу этого урока у вас будут (я надеюсь) некоторые хорошие знания и понимание того, как работать с Kivy. Вот некоторые из вещей, которые мы рассмотрим в этом посте:
- Приступая к работе
- Метод App( ) и макет сетки в деталях
- Что такое метод build и что он делает?
- Структурирование вашего приложения
- Что такое on_release и id?
- Свойство объекта
Приступая к работе.
Хорошо, тогда давайте начнем с черного окна, которое ничего не делает.
Создать main.py файл.
и создайте файл main.kv
Текущая структура файла :
и вот оно у вас есть.
Метод App( ) и макет сетки в деталях
Давайте остановимся на секунду и посмотрим, что мы там сделали.
Одна из вещей, которую я люблю в Kivy, заключается в том, что она очень хорошо документирована, и документы очень легко понять. Посещение kivy/app.py для получения дополнительной информации. Вернемся к вопросу: зачем мы это сделали?
с помощью функции App.run() мы запустили жизненный цикл приложения.
давайте перейдем к следующей строке:
Вы можете найти все вышесказанное по адресу: kivy/uix/gridlayout.py
Для отображения виджета требуется столбец или строка. Как мне это сделать? Еще раз, мы можем посетить документацию для получения инструкций.
Здесь говорится, что строки и cols представляют количество строк и столбцов соответственно в сетке, что приводит нас к причине, по которой мы сделали это в файле main.kv :
Все в порядке? Давайте продолжим.
Что такое метод сборки и что он делает?
Сначала давайте пройдемся по kivy/app.py файл еще раз и посмотрите, что говорится в документации:
Давайте сделаем то же самое для метода build :
Теперь мы знаем причину этого:
Надеюсь, к этому времени все немного прояснится. Однако у нас все еще есть проблема — где кнопки и ярлык? Что ж, давайте их построим.
Структурирование Вашего Приложения
Давайте создадим новую папку и файл buttons.kv в следующей структуре:
Мы только что создали две кнопки (т. е. Добавить кнопку и Вычесть кнопку ), но мы не рассматривали их стили. Мы можем играть с их стилем через Python, но я предпочитаю делать стиль с .kv и логику с Python.
Давайте добавим что-нибудь в наш файл buttons.kv .
Прежде чем мы добавим что-то в класс контейнера (макет сетки), нам сначала нужно сказать Kivy, чтобы он читал из файла buttons.kv в папке kv.
Вот тут-то и появляется builder .
Простой, но неэффективный способ работы с большими проектами-загрузить каждый файл .kv по отдельности.
Мы можем автоматизировать это:
Добавьте как можно больше файлов .kv в папку kv, и они будут автоматически загружены построителем
Итак, мы здесь — мы определили кнопки и контейнер; однако на экране по-прежнему ничего нет. Давайте перейдем к добавлению кнопок (наконец)
Отредактируйте файл main.kv .
подождите…у нас есть еще одна проблема…
Что такое on_release и id?
on_release и on_press являются специальными методами, которые являются частью поведения кнопки (см. kivy | uix| behaviors/button//), тогда как id является свойством каждого виджета (см. kivy/uix/widget.py ).
Прежде чем мы двинемся дальше, потратьте некоторое время на понимание “свойств” в Киви. Вот некоторые ресурсы, которые помогут прояснить ситуацию: Docs , stackoverflow и kivy-wiki .
Свойство объекта
Следующий id будет использоваться для ObjectProperty для связи со стороной Python.
Теперь у нас должно быть наше окончательное рабочее приложение.
Вы можете загрузить окончательное рабочее приложение с github .
Вы можете загрузить окончательное рабочее приложение с || github || .
Вы можете загрузить окончательное рабочее приложение с || github || .
Вывод
Спасибо, что прочитали этот пост — надеюсь, вы нашли это полезным. Вы можете найти меня на GitHub , LinkedIn и CodeMentor . Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне! Больше сообщений:
Пишем «Змейку» под Android на Python и Kivy
В этой статье мы напишем классическую «Змейку» на Python с помощью инструмента для создания GUI Kivy.
Знакомимся с Kivy
Kivy — это популярный инструмент для создания пользовательских интерфейсов, который отлично подходит для разработки приложений и несложных игр. Одним из основных достоинств Kivy является портируемость — возможность безболезненного переноса ваших проектов с одной платформы на другую. Наша «Змейка» будет работать на платформе Android.
Kivy эффективно использует Cython — язык программирования, сочетающий в себе оптимизированность C++ и синтаксис Python — что положительно сказывается на производительности. Также Kivy активно использует GPU для графических процессов, освобождая CPU для других вычислений.
Рекомендуемые ресурсы для начала работы с Kivy:
Устанавливаем Kivy
Зависимости
Прим. перев. Код проверен на Ubuntu 16.04, Cython 0.25, Pygame 1.9.4.dev0, Buildozer 0.33, Kyvi 1.10.
Для правильной работы Kivy нам требуется три основных пакета: Cython, pygame и python-dev. Если вы используете Ubuntu, вам также может понадобиться библиотека gstreamer, которая используется для поддержки некоторых видеовозможностей фреймворка.
Устанавливаем зависимости pygame:
Добавляем репозиторий Kivy:
Buildozer
Этот пакет нам понадобится для упрощения процесса установки нашего Android-приложения:
Нам также понадобится Java JDK. И если вы используете 64-битную систему, вам понадобятся 32-битные версии зависимостей.
Устанавливаем Java JDK:
Устанавливаем 32-битные зависимости:
Оно работает?
Прежде чем начать писать нашу «Змейку», давайте проверим, правильно ли у нас все установилось. Иначе в дальнейшем может обнаружиться, что проект не компилируется из-за какого-нибудь недостающего пакета.
Для проверки напишем старый добрый «Hello, world!».
Приступим к созданию проекта. Нужно перейти в рабочую папку и выполнить команду:
Теперь откроем файл с расширением .spec в любом текстовом редакторе и изменим следующие строки:
- имя нашего приложения title = Hello World ;
- название пакета package.name = helloworldapp ;
- домен пакета (нужен для android/ios сборки) package.domain = org.helloworldapp ;
- закомментируйте эти строки, если они ещё не закомментированы:
- строка version = 1.0.0 должна быть раскомментированной.
Создайте файл main.py и добавьте в него следующий код:
Теперь все готово к сборке. Вернемся к терминалу.
Примечание В случае возникновения каких-либо ошибок установите значение log_level = 2 в файле buildozer.spec. Это даст более развернутое описание ошибки. Теперь мы точно готовы приступить к написанию «Змейки».
Прим. перев. Обратите внимание, что в проекте используется один файл и в статье разбираются лишь куски кода из этого файла. Весь исходный код вы можете просмотреть, перейдя по ссылке на страницу проекта в gitHub.
В этой части урока мы напишем игровой движок нашей «Змейки». И под созданием игрового движка подразумевается:
1. Написание классов, которые станут скелетом нашего приложения.
2. Предоставление им правильных методов и свойств, чтобы мы могли управлять ими по своему усмотрению.
3. Соединение всего в основном цикле приложения.
Классы
Теперь давайте разберем нашу игру на составные элементы: змея и игровое поле. Змея состоит из двух основных элементов: головы и хвоста. И надо не забыть, что змее нужно что-то есть.
Таким образом нам потребуется организовать следующую иерархию виджетов:
Мы объявим наши классы в файлах main.py и snake.kv , чтобы отделить дизайн от логики:
Свойства
Теперь, когда мы реализовали классы, можно задуматься о содержимом.
Playground — это корневой виджет. Мы разделим его на сетку. Эта матрица поможет позиционировать и перемещать объекты по полю. Представление каждого дочернего виджета будет занимать одну клетку. Также нужно реализовать возможность сохранения счета и изменения частоты появления фруктов.
И последнее, но не менее важное: нужно реализовать управление вводом, но сделаем мы это в следующем разделе.
Объект змеи не должен содержать ничего, кроме двух ее деталей: головы и хвоста.
Для головы мы должны знать текущее положение и направление движения для правильного графического представления: если змея движется направо — рисуем треугольник повернутый вправо, если змея движется влево — рисуем треугольник повернутый влево.
Позиция и направление будут соответствовать определенным инструкциям рисования. Для рисования треугольника нам нужно шесть точек (две координаты на одну вершину). Эти координаты будут не ячейками сетки, а определенными пикселями на холсте
Наконец, нам надо хранить информацию об объекте, нарисованном на холсте, чтобы удалить его позже (например, для перезапуска игры). Мы добавим логическую переменную, указывающую, должен ли объект быть нарисован на холсте:
Теперь хвост. Он состоит из блоков (изначально трех), занимающих одну ячейку. Когда «Змейка» будет двигаться, мы будем убирать самый последний блок хвоста и добавлять новый на предыдущую позицию головы:
Фрукт
Поведение фрукта похоже на поведение змеиной головы. Нам понадобится отслеживать его позицию, состояние и интервал появления:
В классе SnakeApp будет происходить запуск нашего приложения:
Кое-что еще: нужно задать размеры виджетов. Каждый элемент будет занимать одну ячейку поля. Значит:
- высота виджета = высота поля / количество строк сетки;
- ширина виджета = ширина поля / количество колонок сетки.
Также нам нужно добавить виджет отображающий текущий счет.
Теперь snake.kv выглядит так:
Методы
Начнем с класса змеи. Мы хотим устанавливать ее в начальное положение и получать информацию о том, где она находится и как взаимодействует с объектами поля:
Мы назвали ряд методов. Теперь давайте их реализуем. Начнем с remove() и add_block() :
Теперь работаем с головой. Она будет иметь две функции: move() и remove() :
А что там с фруктами? Мы должны уметь помещать их в заданные координаты и удалять, когда нам это понадобится:
Почти готово, не сдавайтесь! Теперь нужно организовать весь игровой процесс, который будет происходить в классе Playground . Рассмотрим логику игры: она начинается с того, что змея помещается в случайные координаты. Игра обновляется при каждом перемещении змеи. Во время обновлений мы проверяем направление змеи и ее положение. Если змея сталкивается сама с собой или выходит за пределы поля — мы засчитываем поражение и игра начинается сначала.
Как будет осуществляться управление? Когда игрок касается экрана, мы сохраняем координаты касания. Когда палец будет перемещаться, мы будем сравнивать новое положение с исходным. Если позиция будет изменена на 10 % от размера экрана, мы будем определять это как инструкцию и обрабатывать ее:
Основной цикл
Здесь происходят процессы, устанавливающие положение фрукта, управляющие движением змеи и определяющие проигрыш:
Нужно добавить обработчик для события сброса игры:
Теперь мы можем протестировать игру.
Одна важная деталь. Чтобы приложение запустилось с правильным разрешением экрана, нужно сделать так:
И вуаля! Теперь вы можете запустить приложение. Остается только упаковать его с помощью buildozer и загрузить на устройство.
Создаем экраны
В приложении будет два экрана: приветствия и игровой. Также будет всплывающее меню настроек. Сначала мы сделаем макеты наших виджетов в .kv-файле, а потом напишем соответствующие классы Python.
Внешняя оболочка
PlaygroundScreen содержит только игровое поле:
Основной экран будет состоять из трех встроенных виджетов: название приложения, кнопки запуска игры и кнопки вызывающая меню настроек:
Всплывающее окно будет занимать ¾ экрана приветствия. Оно будет содержать виджеты, необходимые для установки параметров, и кнопку «Сохранить».
Классы
На экране приветствия требуется только метод show_popup() , который будет вызываться при нажатии кнопки настроек на главном экране. Нам не нужно определять что-либо еще для кнопки включения игры, потому что она будет использовать способность своего родителя обращаться к диспетчеру экрана:
Теперь нужно сделать так, чтоб экран приветствия показывался при запуске игры, а игра начиналась только тогда, когда будет показано игровое поле:
Также нам нужно подготовить класс окна настроек, иначе привязка будет работать не правильно:
Теперь добавим ScreenManager в приложение и зарегистрируем два экрана:
Теперь нужно сказать кнопкам, что делать, когда на них нажимают:
После проигрыша нужно возвращаться обратно на экран приветствия:
Добавляем настройки
У нас будет всего два параметра:
- Включение/отключение границ. Если границы включены, при выхождении змеи за пределы экрана засчитывается проигрыш. Если границы выключены, змея будет появляться на другой стороне, если выходит за пределы.
- Скорость змеи.
Добавляем необходимые виджеты во всплывающее окно:
Теперь подготовим классы, чтобы они могли изменяться вместе с настройками. Если границы включены, будем рисовать очертание игрового поля. Также добавим возможность изменения частоты обновления:
Похожие публикации:
- Kb2921916 что за обновление
- Kerio web filter как активировать
- Kltap что это
- Kyocera ecosys p2335dw как подключить к wifi
Приложение на python kivy для разнообразия рациона питания. От кода и до получения .apk файла для Android
Изучаю python kivy и для себя решил написал маленькое приложение, чтобы разнообразить свое питание. Решил поделиться. Статья рассчитана на новичков в kivy. Приложение занимает около 100 строк кода.
Цель создания велосипеда приложения:
- Избежать частых повторений в питании. Чтобы не употреблять одно и то же блюдо слишком часто.
- Не забывать блюда, которые ел, потом забыл и годами к ним не возвращался, потому что банально не помнил. У меня такое бывает.
Интро
Можно не читать, в интро всякая лирика.
Пришлось пожить в одной стране, в одной гостинице, где кормили ежедневно яйцами на завтрак и больше ничем, так через месяц начал чесаться. Обращался за медицинской помощью, хотя раньше никогда ничем подобным не страдал. Наученный горьким опытом после этого для себя решил допускать как можно меньше повторений в еде, чтобы ничего не успевало в организме накопиться. Это мой личный опыт, я просто рассказываю, без навязывания. Возможно, нет правил без исключения, наверное, овсянку можно есть и каждый день на протяжении десятков лет.
Скриншоты
Предположим мой рацион состоит из 50 блюд. Например, сегодня ел омлет. Нажимаю на кнопку, и омлет стал на 50 строку в очереди, а перед ним стоят 49 блюд, которые съем, чтобы опять добраться до омлета. Вот и вся логика приложения. (На скриншотах блюда нагенеренные, все совпадения случайны, к моему реальному рациону отношения не имеющие).
Исходный код и пояснения
main.py
from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout from kivy.uix.screenmanager import ScreenManager, Screen from kivy.uix.recycleview import RecycleView from kivy.uix.gridlayout import GridLayout from kivy.core.window import Window from kivy.config import ConfigParser from kivy.uix.textinput import TextInput from kivy.uix.label import Label from kivy.metrics import dp from datetime import datetime import os import ast import time class MenuScreen(Screen): def __init__(self, **kw): super(MenuScreen, self).__init__(**kw) box = BoxLayout(orientation='vertical') box.add_widget(Button(text='Дневник питания', on_press=lambda x: set_screen('list_food'))) box.add_widget(Button(text='Добавить блюдо в дневник питания', on_press=lambda x: set_screen('add_food'))) self.add_widget(box) class SortedListFood(Screen): def __init__(self, **kw): super(SortedListFood, self).__init__(**kw) def on_enter(self): # Будет вызвана в момент открытия экрана self.layout = GridLayout(cols=1, spacing=10, size_hint_y=None) self.layout.bind(minimum_height=self.layout.setter('height')) back_button = Button(text='< Назад в главное меню', on_press=lambda x: set_screen('menu'), size_hint_y=None, height=dp(40)) self.layout.add_widget(back_button) root = RecycleView(size_hint=(1, None), size=(Window.width, Window.height)) root.add_widget(self.layout) self.add_widget(root) dic_foods = ast.literal_eval( App.get_running_app().config.get('General', 'user_data')) for f, d in sorted(dic_foods.items(), key=lambda x: x[1]): fd = f.decode('u8') + ' ' + (datetime.fromtimestamp(d).strftime('%Y-%m-%d')) btn = Button(text=fd, size_hint_y=None, height=dp(40)) self.layout.add_widget(btn) def on_leave(self): # Будет вызвана в момент закрытия экрана self.layout.clear_widgets() # очищаем список class AddFood(Screen): def buttonClicked(self, btn1): if not self.txt1.text: return self.app = App.get_running_app() self.app.user_data = ast.literal_eval( self.app.config.get('General', 'user_data')) self.app.user_data[self.txt1.text.encode('u8')] = int(time.time()) self.app.config.set('General', 'user_data', self.app.user_data) self.app.config.write() text = "Последнее добавленное блюдо: " + self.txt1.text self.result.text = text self.txt1.text = '' def __init__(self, **kw): super(AddFood, self).__init__(**kw) box = BoxLayout(orientation='vertical') back_button = Button(text='< Назад в главное меню', on_press=lambda x: set_screen('menu'), size_hint_y=None, height=dp(40)) box.add_widget(back_button) self.txt1 = TextInput(text='', multiline=False, height=dp(40), size_hint_y=None, hint_text="Название блюда") box.add_widget(self.txt1) btn1 = Button(text="Добавить блюдо", size_hint_y=None, height=dp(40)) btn1.bind(on_press=self.buttonClicked) box.add_widget(btn1) self.result = Label(text='') box.add_widget(self.result) self.add_widget(box) def set_screen(name_screen): sm.current = name_screen sm = ScreenManager() sm.add_widget(MenuScreen(name='menu')) sm.add_widget(SortedListFood(name='list_food')) sm.add_widget(AddFood(name='add_food')) class FoodOptionsApp(App): def __init__(self, **kvargs): super(FoodOptionsApp, self).__init__(**kvargs) self.config = ConfigParser() def build_config(self, config): config.adddefaultsection('General') config.setdefault('General', 'user_data', '<>') def set_value_from_config(self): self.config.read(os.path.join(self.directory, '%(appname)s.ini')) self.user_data = ast.literal_eval(self.config.get( 'General', 'user_data')) def get_application_config(self): return super(FoodOptionsApp, self).get_application_config( '<>/%(appname)s.ini'.format(self.directory)) def build(self): return sm if __name__ == '__main__': FoodOptionsApp().run()
Я сознательно не использовал kv файлы, так как код дан в учебных целях, для людей, которые знакомы с python. Все написано на голом python. В пояснениях я не буду останавливаться на объяснении python кода, а сразу перейду к специфическим фишкам Kivy.
class MenuScreen(Screen):
box = BoxLayout(orientation='vertical')
Button(text='Дневник питания', on_press=lambda x: set_screen('list_food'))
.add_widget()
self.layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
Grid Layout чем-то напоминает тег table в html, указывается cols — кол-во колонок или rows — кол-во строк.
root = RecycleView(size_hint=(1, None), size=(Window.width, Window.height))
config.get('General', 'user_data')
Запуск на windows & linux & macos
Принцип для всех операционок одинаковый:
- Ставим python3
- Ставим kivy
- Создаем файл main.py и втыкаем в него целиком вышеуказанный код
- Запускаем командой
python3 main.py
Сборка apk файла и запуск на телефоне с андроид
Итак, у нас есть файл с кодом программы, написанный на python. Как теперь создать приложение, чтобы его можно было запустить на телефоне с андроидом? Раньше это был достаточно мудреный процесс, требующий навыков и танцев с бубном. Теперь это не проблема.
Вот пошаговая инструкция:
- Скачиваем готовую виртуальную машину от разработчиков kivy, в которой уже все настроено. https://github.com/Zen-CODE/kivybits/tree/master/KivyCompleteVM. Пароль: kivy
- Запускаем ее в Virtual Box.
- Открываем терминал и вводим следующие команды:
# Ставим последнюю версию python-for-android cd /home/kivy/Repos rm -fr python-for-android/ git clone https://github.com/kivy/python-for-android.git cd ~ mkdir Project cd Project git clone https://github.com/Alexmod/FoodOptions.git cd FoodOptions buildozer android debug # Первый раз эта команда будет долго тянуть 100500 всяких библиотек, # но в следующие разы выполняться за секунды.
Как закинуть apk файл на телефон?
Можно, конечно, сделать это как угодно, отправить себе по почте, куда-нибудь выложить, закинуть в телеграмм и т.д., а потом скачать приложение на телефон.
Но существует специализированный инструмент для этого. Включаем на телефоне режим разработчика, подключаем USB-кабелем. Виртуалка должна увидеть, что вы подключили телефон. Дальше устанавливаем adb:
sudo apt install adb
После установки заходим в папку bin и вводим команду
adb install -r foodoptions-0.1-debug.apk
И можно примерно через минутку увидеть на телефоне приложение после того, как увидим
Success в консоли.
kivy@kivy-complete:~/Project/FoodOptions/bin$ adb install -r foodoptions-0.1-debug.apk 342 KB/s (10083019 bytes in 28.730s) Success kivy@kivy-complete:~/Project/FoodOptions/bin$
Если вдруг приложение падает или ведет себя не так, как ожидалось, то есть вот такая команда для просмотра ошибок
adb logcat| grep python
Русское имя приложения
Если вы захотите, чтобы ваше приложение называлось по-русски, например, «Дневник питания», то надо внести изменения в файл:
.buildozer/android/platform/build/dists/foodoptions/templates/strings.tmpl.xml
В тег appName прописывается русское название приложения, эта папка создается после первого запуска buildozer android debug. После того как файл отредактируете, вернитесь назад в папку FoodOptions и запустите buildozer android debug повторно. Файл соберется по-новой. После установки на телефон имя программы будет написано на русском.
О файле buildozer.spec
Вот мой файл с гитхаба: buildozer.spec
Именно этот файл указывает buildozer-у, как именно собрать пакет.
Там множество разных вариаций. Кому интересно, то введите внутри виртуалки команду:
cd /tmp buildozer init
Будет создан дефолтный файл buildozer.spec с кучей комментариев и пояснений. Например, если вы хотите какую-нибудь свою иконку для приложения, то указываете в строке:
icon.filename = %(source.dir)s/data/icon.png
свой файл с иконкой. И приложение соберется уже с вашей иконкой.
Если вам надо подгрузить какой-нибудь специфический модуль, который не входит в официальную библиотеку python, то это делается в строке requirements =. В общем, рассказ о файле buildozer.spec может занять целую статью, а то и две.
Загрузка приложения в Google Play
Надо зарегаться, пройти все процедуры, получить ключи. И дальше запускать:
sudo apt install zipalign buildozer android release jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore /path/keystore bin/apk-unsigned.apk apkname zipalign -v 4 bin/apk-apkname-unsigned.apk bin/apk-apkname-release.apk
Полученный файл apk-apkname-release.apk заливать в Google Play.
Ссылки
- Видео-уроки по kivy на русском языке. Лично мне понравились
- Статьи на хабре про kivy от HeaTTheatR (и спасибо ему за помощь!)
- Добавить дизайн, чтобы приложение стало красивое
- Использовать kv-файлы, чтобы код стал более легким. Я бы привел такую аналогию: те кто знаком с веб-программированием, представьте себе код без html темплейтов и с html темплейтами. Вынос в kv-файлы кнопок, слоев и прочего — это что-то вроде jinja2 для веб-программиста. Логика остается в .py файлах, а фенечки — в kv-файлах.
- Добавить подсчет калорий, белка, углеводов, жиров (БЖУ)
- Добавить возможность фотографировать блюда