Kivy. Erstellen Sie Pakete für Android und keine Zauberei


In dem gestrigen Python- Artikel in Mobile-Entwicklung , in dem es um die KivyMD- Bibliothek (eine Sammlung von Widgets im Material Design-Stil zur Verwendung im plattformübergreifenden Kivy-Framework) ging, wurde ich in den Kommentaren gebeten, über den Prozess des Erstellens des Pakets für die Android-Plattform zu sprechen. Für viele war und ist dieser Prozess leider eine Art magischer Schamanismus und keine Anfängerangelegenheit. Nun, lass es uns herausfinden, ist alles wirklich kompliziert und bin ich wirklich ein Zauberer und Zauberer ...



Natürlich konnte er! Also haben Sie Ihren Code in Python und Kivy geschrieben. Was braucht es, um es auf Android-Geräten auszuführen? Gehen Sie in das KivyMD-Repository und Sie werden sehen, dass diese Anweisungen die Schritte, mit denen Sie das APK-Paket sammeln können, lange dargelegt haben:

  1. Laden Sie XUbuntu 18.04 herunter

Installieren Sie Virtual Box auf Ihrem Computer.
Erstellen Sie eine neue virtuelle Maschine basierend auf einem heruntergeladenen XUbuntu-Image
Starten Sie die virtuelle XUbuntu-Maschine, öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus:

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 

Das ist alles! Sie haben jetzt eine virtuelle Maschine zum Erstellen von APK-Paketen für Kivy-Apps! Was weiter? Lassen Sie uns tatsächlich eine Testanwendung erstellen. Erstellen Sie das TestKivyMD-Verzeichnis im Ausgangsverzeichnis Ihrer virtuellen Maschine mit der leeren Datei main.py:


Öffnen Sie als Nächstes die Datei main.py und schreiben Sie den Code für unsere Testanwendung, die die KivyMD-Bibliothek verwendet:

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

Speichern, öffnen Sie das Terminal im Verzeichnis mit der Datei main.py und installieren Sie die KivyMD-Bibliothek:

 sudo pip3 install kivymd 

Nach der Installation können Sie unseren Code testen:

 python3 main.py 

Das Ergebnis des Skripts ist ein Bildschirm mit der Symbolleiste und einer Schaltfläche "Hallo Welt":


Als Nächstes müssen wir die Spezifikationsdatei buildozer.spec erstellen, die sich im selben Verzeichnis wie die Datei main.py befinden sollte:


Wenn Sie das Terminal nicht geschlossen haben (wenn das Terminal geschlossen wurde, öffnen Sie es im TestKivyMD-Verzeichnis), geben Sie den folgenden Befehl ein:

 buildozer init 

Dieser Befehl erstellt eine Standardspezifikationsdatei. Öffne es und bearbeite:

 [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 

Hier ist alles klar, daher sind zusätzliche Kommentare nicht erforderlich. Lesen Sie die Standardspezifikation sorgfältig durch, in der Sie den Pfad zum Symbol, das Blinken beim Laden der Anwendung und vieles mehr angeben können. Ich habe nur das gelassen, was wir jetzt brauchen, um unser Testpaket zu erstellen. Tatsächlich starten wir den Erstellungsprozess mit dem Befehl im Terminal:

 buildozer android debug 

Sie können problemlos in die Küche gehen und Kaffee kochen, da das Laden und Zusammenstellen von Bibliotheken zum ersten Mal sehr lange dauern wird. Alle nachfolgenden Zusammenbauten dauern 10-20 Sekunden.

Kaffee ist getrunken und es ist Zeit, in das Terminal zu schauen:


Voila! Unsere Anwendung ist gebaut! Es ist Zeit, es auf dein Smartphone zu legen und zu starten:


Alles arbeitet! Und es stellt sich heraus, dass nicht alles so kompliziert ist, wie es schien.

Sie fragten mich auch:


Weder Flutter noch React Native bieten Vorteile gegenüber der Markup-Sprache Kivy Language, mit der Sie Live-Layouts und Widgets erstellen und positionieren können. Für mich ist die Art und Weise, wie die Benutzeroberfläche in Flutter erstellt wird, eine echte Perversion. Daran konnte nur ein Kranker denken. Um nicht unbegründet zu sein, schauen wir uns den Flutter-Code und den Kivy-Code derselben einfachen Anwendung an ... Es wird so aussehen:


Unten gebe ich den Code aus dem Artikel Über Flutter, kurz: Grundlagen :

 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), ), ), ), ), ); } } 

Und hier ist genau das gleiche, aber mit Kivy und 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() 

Meiner Meinung nach ist die Schlussfolgerung offensichtlich und bedarf meines Kommentars nicht ...

Ich hoffe es war nützlich für dich. Ich hinterlasse eine Umfrage zum Thema "Haben Sie es geschafft, eine Anwendung für Android zu erstellen?".

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


All Articles