さまざまなダイエットのためのpython kivyアプリ。 コードからAndroid用の.apkファイルを受信するまで



私はpython kivyを研究し、自分の食事を多様化するための小さなアプリケーションを書くことにしました。 私はそれを共有することにしました。 この記事は、初心者の方を対象にしています。 アプリケーションには約100行のコードが必要です。



自転車アプリケーションを作成する目的:



  1. 食事中の頻繁な繰り返しを避けてください。 同じ料理を頻繁に食べないようにするため。
  2. 私が食べた料理を忘れないでください、そして忘れてしまい、何年もの間彼らに戻っていませんでした、なぜなら私は角質を覚えていなかったからです。 それは私に起こります。


イントロ



イントロで歌詞を読むことはできません。



ある国の1つのホテルに住んでいたため、朝食に毎日卵を与えられ、それ以降は何もしなかったため、1か月後にかゆみが始まりました。 彼は以前にそのような何かに苦しんだことはありませんでしたが、彼は医療援助を求めました。 苦い経験を​​学んだ後、彼は自分で食物の繰り返しをできる限り少なくして、体内に何も蓄積しないようにすることを決めました。 これは私の個人的な経験です。 おそらく例外のないルールはないでしょう。おそらく、オートミールは何十年も毎日食べることができます。



スクリーンショット







私の食事は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()
      
      





コードはPythonに精通している人々のために教育目的で提供されているため、私は故意にkvファイルを使用しませんでした。 すべてが裸のPythonで書かれています。 説明では、Pythonコードの説明には触れませんが、すぐにKivyの特定の機能に進みます。



行こう:





Windows、Linux、MacOSで実行する



すべてのオペレーティングシステムの原則は同じです。



  1. python3を配置します
  2. キビーを入れます
  3. main.pyファイルを作成し、上記のコード全体をそこに貼り付けます
  4. チームで実行



     python3 main.py
          
          





プログラムは動作するはずです。



APKファイルを作成し、Androidを使用して携帯電話で実行する



そのため、Pythonで記述されたプログラムコードファイルがあります。 Androidフォンで起動できるようにアプリケーションを作成する方法は? 以前は、タンバリンとのスキルとダンスを必要とするかなり洗練されたプロセスでした。 これは問題ではありません。

手順を追った説明を次に示します。



  1. kivy開発者から既製の仮想マシンをダウンロードします。すべての仮想マシンがすでに構成されています。 https://github.com/Zen-CODE/kivybits/blob/master/KivyCompleteVM/ReadMe.txt パスワード:kivy

  2. Virtual Boxで起動します。
  3. ターミナルを開き、次のコマンドを入力します。



     #    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. 最後のコマンドは、同じディレクトリにbinフォルダーを作成します。binには、foodoptions-0.1-debug.apkファイルがあります。このファイルは、電話にアップロードして、アプリケーションをインストールして楽しむことができます。








apkファイルを携帯電話にアップロードする方法は?



もちろん、好きなように実行し、メールで送信し、どこかに置き、電報などに入れてから、アプリケーションを携帯電話にダウンロードできます。



しかし、これには専用のツールがあります。 電話で開発者モードをオンにし、USBケーブルで接続します。 仮想マシンは、電話が接続されたことを確認する必要があります。 次に、adbをインストールします。



 sudo apt install adb
      
      





インストール後、binフォルダーに移動してコマンドを入力します



 adb install -r foodoptions-0.1-debug.apk
      
      





そして、私たちが見た後約1分で電話でアプリケーションを見ることができます

コンソールでの成功。



 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
      
      





ロシア語のアプリケーション名



「Food Diary」など、アプリケーションをロシア語で呼び出す場合は、ファイルに変更を加える必要があります。



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





アプリケーションのロシア語の名前はappNameタグに書き込まれます。このフォルダーは、buildozer android debugの最初の起動後に作成されます。 ファイルを編集した後、FoodOptionsフォルダーに戻り、buildozer android debugを再度実行します。 ファイルは新しい方法でアセンブルされます。 電話でのインストール後、プログラム名はロシア語で書かれます。



buildozer.specファイルについて



これが私のgithubファイルです: buildozer.spec

このファイルはbuildozerにパッケージのビルド方法を正確に伝えます。



さまざまなバリエーションがあります。 気にする人は、仮想マシン内でコマンドを入力します:



 cd /tmp buildozer init
      
      





デフォルトのbuildozer.specファイルが作成され、多数のコメントと説明が含まれます。 たとえば、アプリケーションのアイコンが必要な場合は、次の行で示します。



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





アイコン付きのファイル。 そして、アプリケーションは既にアイコンで組み立てられています。



公式のpythonライブラリの一部ではない特定のモジュールをロードする必要がある場合は、requirements =行で行います。 一般に、buildozer.specファイルに関するストーリーには、記事全体、または2つも含まれます。



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にアップロードされます。



参照資料





原則として、Pythonでプログラミングできる人は誰でもアプリケーションを変更して、次のものを簡単に追加できます。



  1. デザイン追加してアプリを美しくする
  2. kvファイル使用して、コードを簡単にします。 たとえば、Webプログラミングに精通している人は、HTMLテンプレートとHTMLテンプレートのないコードを想像してください。 ボタン、レイヤー、その他をkvファイルに削除することは、Webプログラマーにとってはjinja2のようなものです。 ロジックは.pyファイルに残り、つまらないものはkvファイルに残ります。
  3. カロリー、タンパク質、炭水化物、脂肪をカウントする(BJU)
  4. 料理を撮影する機能を追加します



All Articles