Eine Python Kivy App für eine abwechslungsreiche Ernährung. Vom Code zum Empfang der APK-Datei für Android


Ich studiere Python Kivy und habe mich entschlossen, eine kleine Anwendung zu schreiben, um meine Ernährung zu diversifizieren. Ich beschloss, es zu teilen. Dieser Artikel ist für Neulinge in Kivy. Die Anwendung benötigt ungefähr 100 Codezeilen.

Zweck der Erstellung einer Fahrradanwendung:

  1. Vermeiden Sie häufige Wiederholungen in Lebensmitteln. Um nicht zu oft das gleiche Gericht zu essen.
  2. Vergessen Sie nicht die Gerichte, die ich gegessen und dann vergessen habe und die ich jahrelang nicht wieder gesehen habe, weil ich mich nicht an kitschig erinnerte. Es passiert mir.

Intro


Sie können im Intro keine Texte lesen.

Ich musste in einem Land leben, in einem Hotel, wo ich täglich Eier zum Frühstück und nichts mehr bekam, also fing ich einen Monat später an zu jucken. Er suchte medizinische Hilfe, obwohl er so etwas noch nie zuvor erlitten hatte. Nach bitterer Erfahrung entschied er sich danach, so wenig Wiederholungen wie möglich in der Nahrung zuzulassen, damit sich nichts im Körper ansammeln konnte. Dies ist meine persönliche Erfahrung, sage ich nur, ohne sie aufzuzwingen. Vielleicht gibt es ausnahmslos keine Regeln, wahrscheinlich kann Haferflocken jahrzehntelang jeden Tag gegessen werden.

Screenshots




Angenommen, meine Ernährung besteht aus 50 Gerichten. Zum Beispiel habe ich heute ein Omelett gegessen. Ich klicke auf den Knopf und das Omelett steht in Zeile 50 in der Zeile, und davor stehen 49 Gerichte, die ich essen werde, um wieder zum Omelett zu gelangen. Das ist die ganze Logik der Anwendung. (In den Screenshots werden die Gerichte gekocht, alle Zufälle sind zufällig, sie haben nichts mit meiner richtigen Ernährung zu tun).

Quellcode und Erklärungen


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

Ich habe absichtlich keine kv-Dateien für Personen verwendet, die mit Python vertraut sind, da der Code zu Bildungszwecken angegeben wird. Alles ist in nackter Python geschrieben. In den Erklärungen werde ich nicht auf die Erklärung des Python-Codes eingehen, sondern sofort auf die Besonderheiten von Kivy eingehen.

Lass uns gehen:

  •  class MenuScreen(Screen): 

    Die Klasse ist für das Starten der Anwendungsstartseite verantwortlich. Sie kann als beliebig bezeichnet werden, z. B. StartScreen. Und erbt das Kivy Screen Modul . Die Anwendung besteht aus 3 Fenstern, diese Fenster werden mit diesem Modul erstellt
  •  box = BoxLayout(orientation='vertical') 

    BoxLayout teilt den Bildschirm in gleiche Teile, standardmäßig horizontal. Ich habe Ausrichtung = 'vertikal' geschrieben, um vertikal zu teilen
  •  Button(text=' ', on_press=lambda x: set_screen('list_food')) 

    Button - Erstellt Buttons. On_press legt fest, welche Funktion beim Drücken gestartet wird.
  •  .add_widget() 
    - Fügt Ebenen und Fenstern Schaltflächen hinzu
  •  self.layout = GridLayout(cols=1, spacing=10, size_hint_y=None) 

    Das Rasterlayout erinnert etwas an das Tabellen-Tag in HTML und gibt Spalten an - die Anzahl der Spalten oder Zeilen - die Anzahl der Zeilen.

    Sie können beide Parameter oder einen Parameter angeben.
    Der Bildschirm wird in die gewünschte Anzahl von Feldern unterteilt.
  •  root = RecycleView(size_hint=(1, None), size=(Window.width, Window.height)) 

    RecycleView - das Modul, mit dem in meiner Anwendung ein vertikaler Bildlauf erstellt werden kann . Eine Funktion von RecycleView besteht darin, dass Schriftrollen mit Elementen gleicher Breite und Höhe erstellt werden. Und es funktioniert schnell. Und es gibt ein ScrollView- Modul, das Schriftrollen mit Elementen unterschiedlicher Größe erstellen kann, aber langsamer als RecycleView arbeitet
  •  config.get('General', 'user_data') 
    - Im Code werden solche Zeilen häufig gefunden. Ich habe gerade das native Config Kivy Repository als Datenspeicher verwendet. Nun, lassen Sie es mehrere tausend Gerichte geben, es macht keinen Sinn, einen Garten mit Sqlite und so etwas zu umzäunen. Alle Daten werden in einer Datei gespeichert. Diese Datei wird im selben Ordner wie die Anwendung selbst gespeichert, wenn Sie self.directory wie in meinem Code angeben. Sie können jedoch self.user_data_dir angeben, damit diese Datei während der Permutation oder Aktualisierung nicht zerstört wird.

Läuft unter Windows & Linux & Macos


Das Prinzip für alle Betriebssysteme ist das gleiche:

  1. Wir setzen python3
  2. Wir setzen Kivy
  3. Wir erstellen die Datei main.py und stecken den gesamten obigen Code hinein
  4. Vom Team geführt

     python3 main.py 

Das Programm sollte funktionieren.

Erstellen Sie eine APK-Datei und führen Sie sie mit Android auf dem Telefon aus


Wir haben also eine Programmcodedatei in Python geschrieben. Wie erstelle ich jetzt eine Anwendung, damit sie auf einem Telefon mit einem Android gestartet werden kann? Zuvor war es ein ziemlich ausgefeilter Prozess, der Fähigkeiten und Tänze mit einem Tamburin erforderte. Das ist kein Problem.
Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Laden Sie eine vorgefertigte virtuelle Maschine von Kivy-Entwicklern herunter, in der bereits alles konfiguriert ist. https://github.com/Zen-CODE/kivybits/blob/master/KivyCompleteVM/ReadMe.txt . Passwort: kivy
  2. Wir starten es in der Virtual Box.
  3. Öffnen Sie das Terminal und geben Sie folgende Befehle ein:

     #    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. Der letzte Befehl erstellt den Ordner bin im selben Verzeichnis. In bin finden Sie die Datei foodoptions-0.1-debug.apk, die Sie auf Ihr Telefon hochladen, installieren und die Anwendung genießen können


Wie lade ich eine APK-Datei auf das Telefon hoch?

Natürlich können Sie es tun, wie Sie möchten, es per Post senden, irgendwo ablegen, in ein Telegramm einfügen usw. und dann die Anwendung auf Ihr Telefon herunterladen.

Dafür gibt es aber ein spezielles Werkzeug. Wir schalten den Entwicklermodus am Telefon ein und verbinden ihn mit einem USB-Kabel. Die virtuelle Maschine sollte sehen, dass Sie das Telefon verbunden haben. Als nächstes installieren Sie adb:

 sudo apt install adb 

Wechseln Sie nach der Installation in den Ordner bin und geben Sie den Befehl ein

 adb install -r foodoptions-0.1-debug.apk 

Und Sie können die Anwendung in ungefähr einer Minute, nachdem wir sie gesehen haben, auf dem Telefon sehen
Erfolg in der Konsole.

 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$ 

Wenn die Anwendung plötzlich abstürzt oder sich nicht wie erwartet verhält, gibt es einen solchen Befehl zum Anzeigen von Fehlern

 adb logcat| grep python 

Name der russischen Anwendung

Wenn Sie möchten, dass Ihre Anwendung auf Russisch aufgerufen wird, z. B. "Ernährungstagebuch", müssen Sie Änderungen an der Datei vornehmen:

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

Der russische Name der Anwendung wird in das Tag appName geschrieben. Dieser Ordner wird nach dem ersten Start des Buildozer-Android-Debugs erstellt. Kehren Sie nach dem Bearbeiten der Datei zum Ordner FoodOptions zurück und führen Sie das Buildozer-Android-Debug erneut aus. Die Datei wird auf neue Weise zusammengestellt. Nach der Installation auf dem Telefon wird der Programmname in russischer Sprache geschrieben.

Informationen zur Datei buildozer.spec

Hier ist meine Github-Datei: buildozer.spec
Diese Datei teilt Buildozer genau mit, wie das Paket erstellt wird.

Es gibt viele verschiedene Variationen. Wen kümmert es, dann geben Sie den Befehl in der virtuellen Maschine ein:

 cd /tmp buildozer init 

Eine Standarddatei buildozer.spec wird mit einer Reihe von Kommentaren und Erklärungen erstellt. Wenn Sie beispielsweise ein Symbol für Ihre Anwendung wünschen, geben Sie in der Zeile Folgendes an:

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

Ihre Datei mit einem Symbol. Und die Anwendung wird bereits mit Ihrem Symbol zusammengestellt.

Wenn Sie ein bestimmtes Modul laden müssen, das nicht Teil der offiziellen Python-Bibliothek ist, erfolgt dies in der Zeile require =. Im Allgemeinen kann die Geschichte über die Datei buildozer.spec einen ganzen oder sogar zwei Artikel enthalten.

Laden Sie eine Anwendung auf Google Play herunter

Es ist notwendig, sich zu registrieren, alle Verfahren durchzugehen und die Schlüssel zu erhalten. Und dann laufen:

 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 

Die resultierende Datei apk-apkname-release.apk wird auf Google Play hochgeladen.

Referenzen



Grundsätzlich kann jede Person, die in Python programmieren kann, die Anwendung ändern und auf einfache Weise Folgendes hinzufügen:

  1. Fügen Sie Design hinzu , um die App schön zu machen
  2. Verwenden Sie kv-Dateien , um den Code zu vereinfachen. Ich würde eine Analogie geben: Wer mit Webprogrammierung vertraut ist, stellt sich Code ohne HTML-Vorlagen und HTML-Vorlagen vor. Das Entfernen von Schaltflächen, Ebenen und anderen Dingen in kv-Dateien ist für einen Webprogrammierer so etwas wie jinja2. Die Logik verbleibt in den .py-Dateien, und die Kugeln verbleiben in den kv-Dateien.
  3. Fügen Sie Zählkalorien, Eiweiß, Kohlenhydrate, Fette (BJU) hinzu
  4. Fügen Sie die Möglichkeit hinzu, Gerichte zu fotografieren

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


All Articles