Una aplicación python kivy para una dieta variada. Desde el código hasta la recepción del archivo .apk para Android


Estudio Python Kivy y decidí escribir una pequeña aplicación para diversificar mi dieta. Decidí compartirlo. Este artículo es para los recién llegados a kivy. La aplicación toma alrededor de 100 líneas de código.

Propósito de crear una aplicación de bicicleta:

  1. Evitar repeticiones frecuentes en la comida. Para no comer el mismo plato con demasiada frecuencia.
  2. No olvide los platos que comí, luego olvidé, y durante años no volví a ellos, porque no recordaba cursi. Me pasa a mi

Introducción


No puedes leer en la introducción ninguna letra.

Tenía que vivir en un país, en un hotel, donde me daban huevos a diario para el desayuno y nada más, así que un mes después comencé a picar. Buscó ayuda médica, aunque nunca antes había sufrido algo así. Enseñado por la amarga experiencia, después de eso, decidió por sí mismo permitir la menor cantidad posible de repeticiones en los alimentos para que nada pudiera acumularse en el cuerpo. Esta es mi experiencia personal, solo digo, sin imponer. Tal vez no haya reglas sin excepción, probablemente se pueda comer avena todos los días durante décadas.

Capturas de pantalla




Supongamos que mi dieta consiste en 50 platos. Por ejemplo, hoy comí una tortilla. Hago clic en el botón, y la tortilla está en la línea 50 en línea, y frente a ella hay 49 platos que comeré para volver a la tortilla. Esa es toda la lógica de la aplicación. (En las capturas de pantalla, los platos están cocinados, todas las coincidencias son aleatorias, no tienen nada que ver con mi dieta real).

Código fuente y explicaciones


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() 

Deliberadamente no utilicé archivos kv, ya que el código se proporciona con fines educativos, para personas que están familiarizadas con Python. Todo está escrito en python desnudo. En las explicaciones, no me detendré en la explicación del código de Python, sino que procederé inmediatamente a las características específicas de Kivy.

Vamos:

  •  class MenuScreen(Screen): 

    La clase es responsable de iniciar la página de inicio de la aplicación, se puede llamar cualquier cosa, por ejemplo, StartScreen. Y hereda el módulo de pantalla kivy . La aplicación consta de 3 ventanas, estas ventanas se crean utilizando este módulo
  •  box = BoxLayout(orientation='vertical') 

    BoxLayout divide la pantalla en partes iguales, horizontal por defecto, escribí orientación = 'vertical' para dividir verticalmente
  •  Button(text=' ', on_press=lambda x: set_screen('list_food')) 

    Botón : crea botones, on_press establece qué función se iniciará cuando se presione.
  •  .add_widget() 
    - agrega botones a capas y ventanas
  •  self.layout = GridLayout(cols=1, spacing=10, size_hint_y=None) 

    El diseño de cuadrícula recuerda un poco a la etiqueta de la tabla en html, que indica cols, el número de columnas o filas, el número de filas.

    Puede especificar ambos parámetros o un parámetro.
    La pantalla se dividirá en el número deseado de bahías.
  •  root = RecycleView(size_hint=(1, None), size=(Window.width, Window.height)) 

    RecycleView : el módulo con el que crear un desplazamiento vertical en mi aplicación. Una característica de RecycleView es que construye pergaminos con elementos del mismo ancho y alto. Y funciona rápido. Y hay un módulo ScrollView , puede construir pergaminos con elementos de diferentes tamaños, pero funciona más lento que RecycleView
  •  config.get('General', 'user_data') 
    - en el código a menudo se encuentran tales líneas. Acabo de usar el repositorio nativo de Config kivy como el almacén de datos. Bueno, que haya varios miles de platos, no tiene sentido cercar un jardín con sqlite y algo así. Todos los datos se almacenan en un archivo. Este archivo se almacena en la misma carpeta que la aplicación en sí, si especifica self.directory como en mi código, pero puede especificar self.user_data_dir para que este archivo no se destruya durante la permutación o las actualizaciones.

Ejecutando en windows y linux y macos


El principio para todos los sistemas operativos es el mismo:

  1. Ponemos python3
  2. Ponemos kivy
  3. Creamos el archivo main.py y le pegamos todo el código anterior
  4. Dirigido por equipo

     python3 main.py 

El programa debería funcionar.

Cree el archivo apk y ejecútelo en el teléfono con Android


Entonces, tenemos un archivo de código de programa escrito en python. ¿Cómo crear una aplicación para que se pueda iniciar en un teléfono con un Android? Anteriormente, era un proceso bastante sofisticado que requería habilidades y bailes con una pandereta. Ahora esto no es un problema.
Aquí hay una instrucción paso a paso:

  1. Descargue una máquina virtual lista para usar de los desarrolladores de kivy, en la que todo ya está configurado. https://github.com/Zen-CODE/kivybits/blob/master/KivyCompleteVM/ReadMe.txt . Contraseña: kivy
  2. Lo lanzamos en la caja virtual.
  3. Abra la terminal e ingrese los siguientes comandos:

     #    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  , #       . 
  4. El último comando crea la carpeta bin en el mismo directorio, en bin encontrará el archivo foodoptions-0.1-debug.apk, que puede cargar en su teléfono, instalar y disfrutar de la aplicación.


¿Cómo subir un archivo apk al teléfono?

Por supuesto, puede hacerlo a su gusto, enviarlo por correo, ponerlo en algún lugar, ponerlo en un telegrama, etc., y luego descargar la aplicación a su teléfono.

Pero hay una herramienta especializada para esto. Activamos el modo desarrollador en el teléfono, lo conectamos con un cable USB. La máquina virtual debería ver que ha conectado el teléfono. A continuación, instale adb:

 sudo apt install adb 

Después de la instalación, vaya a la carpeta bin e ingrese el comando

 adb install -r foodoptions-0.1-debug.apk 

Y puede ver la aplicación en el teléfono aproximadamente un minuto después de que veamos
Éxito en la consola.

 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$ 

Si de repente la aplicación falla o no se comporta como se esperaba, entonces existe un comando para ver los errores

 adb logcat| grep python 

Nombre de la aplicación rusa

Si desea que su aplicación se llame en ruso, por ejemplo, "Diario de alimentos", debe realizar cambios en el archivo:

 .buildozer/android/platform/build/dists/foodoptions/templates/strings.tmpl.xml 

El nombre ruso de la aplicación está escrito en la etiqueta appName, esta carpeta se crea después del primer lanzamiento de la depuración de Android Buildozer. Después de editar el archivo, regrese a la carpeta FoodOptions y ejecute la depuración de Android Buildozer nuevamente. El archivo se ensamblará de una nueva manera. Después de la instalación en el teléfono, el nombre del programa se escribirá en ruso.

Acerca del archivo buildozer.spec

Aquí está mi archivo github : buildozer.spec
Este archivo le dice a Buildozer exactamente cómo construir el paquete.

Hay muchas variaciones diferentes. A quién le importa, luego ingrese el comando dentro de la máquina virtual:

 cd /tmp buildozer init 

Se creará un archivo buildozer.spec predeterminado con un montón de comentarios y explicaciones. Por ejemplo, si desea algún ícono para su aplicación, indique en la línea:

 icon.filename = %(source.dir)s/data/icon.png 

Su archivo con un icono. Y la aplicación ya se ensamblará con su icono.

Si necesita cargar algún módulo específico que no es parte de la biblioteca oficial de Python, esto se hace en la línea require =. En general, la historia sobre el archivo buildozer.spec puede tomar un artículo completo, o incluso dos.

Descargar una aplicación en Google Play

Es necesario registrarse, realizar todos los procedimientos, obtener las claves. Y luego corre:

 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 

El archivo resultante apk-apkname-release.apk sube a Google Play.

Referencias



En principio, cualquier persona que pueda programar en python podrá cambiar la aplicación y agregar fácilmente lo siguiente:

  1. Agregue diseño para hacer que la aplicación sea hermosa
  2. Use archivos kv para facilitar el código. Daría una analogía: aquellos que están familiarizados con la programación web, imaginan código sin plantillas html y plantillas html. Eliminar botones, capas y otras cosas en archivos kv es algo así como jinja2 para un programador web. La lógica permanece en los archivos .py, y las bolas permanecen en los archivos kv.
  3. Agregue el conteo de calorías, proteínas, carbohidratos, grasas (BJU)
  4. Agregue la capacidad de fotografiar platos

Source: https://habr.com/ru/post/es426269/


All Articles