Kivy. Créez des packages pour Android et pas de magie


Dans l'article Python d'hier sur le développement mobile , qui parlait de la bibliothèque KivyMD (une collection de widgets de style Material Design à utiliser dans le cadre multiplateforme Kivy), on m'a demandé dans les commentaires de parler du processus de construction du package pour la plateforme Android. Pour beaucoup, ce processus, malheureusement, était et reste une sorte de chamanisme magique et non une affaire pour les débutants. Eh bien, essayons de comprendre, tout est vraiment compliqué et je suis vraiment un magicien et un sorcier ...



Bien sûr qu'il le pouvait! Vous avez donc écrit votre code en Python et Kivy. Que faut-il pour l'exécuter sur des appareils Android? Accédez au référentiel KivyMD et vous verrez que ces instructions ont depuis longtemps énoncé les étapes qui vous permettront de collecter le package APK:

  1. Télécharger XUbuntu 18.04

Installez Virtual Box sur votre ordinateur.
Créer une nouvelle machine virtuelle basée sur une image XUbuntu téléchargée
Démarrez la machine virtuelle XUbuntu, ouvrez un terminal et exécutez la commande suivante:

wget https://github.com/HeaTTheatR/KivyMD-data/raw/master/install-kivy-buildozer-dependencies.sh 

 chmod +x install-kivy-buildozer-dependencies.sh 

 ./install-kivy-buildozer-dependencies.sh 

C’est tout! Vous avez maintenant une machine virtuelle pour créer des packages APK pour les applications Kivy! Et ensuite? Créons en fait une application de test. Créez le répertoire TestKivyMD dans le répertoire home de votre machine virtuelle avec le fichier main.py vide:


Ensuite, ouvrez le fichier main.py et écrivez le code de notre application de test qui utilisera la bibliothèque KivyMD:

 from kivy.lang import Builder from kivymd.app import MDApp KV = """ Screen: MDToolbar: title: "My firt app" elevation: 10 md_bg_color: app.theme_cls.primary_color left_action_items: [["menu", lambda x: x]] pos_hint: {"top": 1} MDRaisedButton: text: "Hello World" pos_hint: {"center_x": .5, "center_y": .5} """ class HelloWorld(MDApp): def build(self): return Builder.load_string(KV) HelloWorld().run() 

Enregistrez, ouvrez le terminal dans le répertoire avec le fichier main.py et installez la bibliothèque KivyMD:

 sudo pip3 install kivymd 

Après l'installation, vous pouvez tester notre code:

 python3 main.py 

Le résultat du script sera un écran avec la barre d'outils et un bouton "Hello World":


Ensuite, nous devons créer le fichier de spécification buildozer.spec, qui devrait se trouver dans le même répertoire que le fichier main.py:


Si vous n'avez pas fermé le terminal (si le terminal était fermé, ouvrez-le dans le répertoire TestKivyMD), entrez la commande:

 buildozer init 

Cette commande créera un fichier de spécifications par défaut. Ouvrez-le et modifiez:

 [app] # (str) Title of your application title = KivyMDTest # (str) Package name package.name = kivymd_test # (str) Package domain (needed for android/ios packaging) package.domain = com.heattheatr # (str) Source code where the main.py live source.dir = . # (list) Source files to include (let empty to include all the files) source.include_exts = py,png,jpg,jpeg,ttf # (list) Application version version = 0.0.1 # (list) Application requirements # comma separated eg requirements = sqlite3,kivy requirements = python3,kivy==1.11.1,kivymd # (str) Supported orientation (one of landscape, sensorLandscape, portrait or all) orientation = portrait # (bool) Indicate if the application should be fullscreen or not fullscreen = 1 # (list) Permissions android.permissions = INTERNET,WRITE_EXTERNAL_STORAGE # (int) Target Android API, should be as high as possible. android.api = 28 # (int) Minimum API your APK will support. android.minapi = 21 # (str) Android NDK version to use android.ndk = 17c # (bool) If True, then skip trying to update the Android sdk # This can be useful to avoid excess Internet downloads or save time # when an update is due and you just want to test/build your package android.skip_update = False # (bool) If True, then automatically accept SDK license # agreements. This is intended for automation only. If set to False, # the default, you will be shown the license when first running # buildozer. android.accept_sdk_license = True # (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64 android.arch = armeabi-v7a [buildozer] # (int) Log level (0 = error only, 1 = info, 2 = debug (with command output)) log_level = 2 # (int) Display warning if buildozer is run as root (0 = False, 1 = True) warn_on_root = 0 # (str) Path to build artifact storage, absolute or relative to spec file build_dir = ./.buildozer # (str) Path to build output (ie .apk, .ipa) storage bin_dir = ./bin 

Tout est clair ici, par conséquent, des commentaires supplémentaires ne sont pas nécessaires. Lisez attentivement la spécification par défaut, vous pouvez spécifier le chemin vers l'icône, flasher lors du chargement de l'application et bien plus encore. Je n'ai laissé que ce dont nous avons besoin pour construire notre package de test. Et, en fait, nous commençons le processus de construction avec la commande dans le terminal:

 buildozer android debug 

Vous pouvez aller en toute sécurité dans la cuisine et faire du café, car pour la première fois le processus de chargement et de compilation des bibliothèques prendra beaucoup de temps. Tous les assemblages suivants prennent 10 à 20 secondes.

Le café est bu et il est temps de regarder dans le terminal:


Voila! Notre application est construite! Il est temps de le déposer sur votre smartphone et d'exécuter:


Tout fonctionne! Et il s'avère que tout n'est pas aussi compliqué qu'il n'y paraissait.

Ils m'ont également demandé:


Ni Flutter ni React Native n'ont d'avantages par rapport au langage de balisage Kivy Language, qui vous permet de créer et de positionner des mises en page et des widgets en direct. Quant à moi, la façon dont l'interface utilisateur est construite dans Flutter est une véritable perversion. Seul un malade pouvait y penser. Pour ne pas être infondé, regardons le code Flutter et le code Kivy de la même application simple ... Il ressemblera à ceci:


Ci-dessous, je donne brièvement le code de l'article À propos de Flutter :

 import 'package:flutter/widgets.dart'; main() => runApp( Directionality( textDirection: TextDirection.ltr, child: Container( color: Color(0xFFFFFFFF), child: App(), ), ), ); class App extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: GestureDetector( //     onTap: () { //    GestureDetector //    ,      print('You pressed me'); }, child: Container( //     decoration: BoxDecoration( //   shape: BoxShape.circle, //     color: Color(0xFF17A2B8), //      ), width: 80.0, height: 80.0, ), ), ); } } class Counter extends StatefulWidget { //      ,     , //   createState() @override State<Counter> createState() => _CounterState(); //        State, //   State<> } class _CounterState extends State<Counter> { //    -    , //      . //   ,     int counter = 0; //     ,       //   ,      Stateless . @override Widget build(BuildContext context) { //          , //     —  : return Center( child: GestureDetector( onTap: () { //  ,   ,    //  counter. setState(() { // setState()   ,    //      ,    ++counter; }); }, child: Container( decoration: BoxDecoration( shape: BoxShape.circle, color: Color(0xFF17A2B8), ), width: 80.0, child: Center( child: Text( //    counter '$counter', //      style: TextStyle(fontSize: 30.0), ), ), ), ), ); } } 

Et voici exactement la mĂŞme chose, mais en utilisant Kivy et KivyMD:

 from kivy.lang import Builder from kivymd.app import MDApp KV = """ #:import get_color_from_hex kivy.utils.get_color_from_hex Screen: MDCard: MDLabel: value: 0 text: str(self.value) halign: "center" on_touch_down: self.value += 1 canvas.before: Color: rgba: get_color_from_hex("#4eaabe") Ellipse: pos: self.center[0] - dp(25), self.center[1] - dp(25) size: dp(50), dp(50) """ class HelloWorld(MDApp): def build(self): return Builder.load_string(KV) HelloWorld().run() 

Ă€ mon avis, la conclusion est Ă©vidente et n'a pas besoin de mon commentaire ...

J'espère que cela vous a été utile. Je laisse un sondage sur le sujet "Avez-vous réussi à créer une application pour Android".

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


All Articles