Aplikasi python kivy untuk diet yang bervariasi. Dari kode hingga menerima file .apk untuk Android


Saya belajar python kivy dan memutuskan sendiri untuk menulis aplikasi kecil untuk mendiversifikasi diet saya. Saya memutuskan untuk membagikannya. Artikel ini untuk pendatang baru untuk kivy. Aplikasi ini membutuhkan sekitar 100 baris kode.

Tujuan membuat aplikasi sepeda:

  1. Hindari pengulangan yang sering dalam makanan. Agar tidak makan hidangan yang sama terlalu sering.
  2. Jangan lupa hidangan yang saya makan, lalu lupa, dan selama bertahun-tahun tidak kembali ke mereka, karena saya tidak ingat norak. Itu terjadi pada saya.

Intro


Anda tidak dapat membaca lirik di intro.

Saya harus tinggal di satu negara, di satu hotel, di mana saya diberi makan telur setiap hari untuk sarapan dan tidak lebih, jadi sebulan kemudian saya mulai gatal. Dia mencari bantuan medis, meskipun dia belum pernah menderita yang seperti ini sebelumnya. Diajarkan oleh pengalaman pahit, setelah itu dia memutuskan untuk dirinya sendiri untuk memungkinkan pengulangan sesedikit mungkin dalam makanan sehingga tidak ada yang bisa menumpuk di tubuh. Saya katakan ini adalah pengalaman pribadi saya, tanpa memaksakan. Mungkin tidak ada aturan tanpa kecuali, mungkin oatmeal dapat dimakan setiap hari selama beberapa dekade.

Tangkapan layar




Misalkan diet saya terdiri dari 50 hidangan. Sebagai contoh, saya makan telur dadar hari ini. Saya klik tombolnya, dan omeletnya ada di baris 50 sejalan, dan di depannya ada 49 hidangan yang akan saya makan untuk sampai ke omelet lagi. Itulah keseluruhan logika aplikasi. (Dalam tangkapan layar, hidangan dimasak, semua kebetulan adalah acak, tidak ada hubungannya dengan diet saya yang sebenarnya).

Kode Sumber dan Penjelasan


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

Saya sengaja tidak menggunakan file kv, karena kode ini diberikan untuk tujuan pendidikan, untuk orang-orang yang terbiasa dengan python. Semuanya ditulis dengan python telanjang. Dalam penjelasannya, saya tidak akan membahas penjelasan kode python, tetapi segera melanjutkan ke fitur spesifik Kivy.

Ayo pergi:

  •  class MenuScreen(Screen): 

    Kelas bertanggung jawab untuk meluncurkan halaman awal aplikasi, dapat disebut apa saja, misalnya, StartScreen. Dan mewarisi modul Layar kivy . Aplikasi terdiri dari 3 jendela, jendela ini dibuat menggunakan modul ini
  •  box = BoxLayout(orientation='vertical') 

    BoxLayout membagi layar menjadi bagian yang sama, horisontal secara default, saya menulis orientasi = 'vertikal' untuk membelah secara vertikal
  •  Button(text=' ', on_press=lambda x: set_screen('list_food')) 

    Tombol - membuat tombol, on_press mengatur fungsi mana yang akan diluncurkan saat ditekan.
  •  .add_widget() 
    - Menambahkan tombol ke lapisan dan jendela
  •  self.layout = GridLayout(cols=1, spacing=10, size_hint_y=None) 

    Layout Grid agak mengingatkan pada tag tabel dalam html, menunjukkan cols - jumlah kolom atau baris - jumlah baris.

    Anda dapat menentukan parameter atau satu parameter.
    Layar akan dibagi menjadi jumlah rongga yang diinginkan.
  •  root = RecycleView(size_hint=(1, None), size=(Window.width, Window.height)) 

    RecycleView - modul yang dapat digunakan untuk membuat gulir vertikal di aplikasi saya. Fitur RecycleView adalah ia membangun gulungan dengan elemen dengan lebar dan tinggi yang sama. Dan itu bekerja dengan cepat. Dan ada modul ScrollView , ia dapat membangun gulungan dengan elemen ukuran yang berbeda, tetapi bekerja lebih lambat dari RecycleView
  •  config.get('General', 'user_data') 
    - dalam kode baris seperti itu sering ditemukan. Saya hanya menggunakan repositori asli Config kivy sebagai penyimpan data. Baiklah, biarlah ada beberapa ribu hidangan, tidak masuk akal memagari taman dengan sqlite dan semacamnya. Semua data disimpan dalam satu file. File ini disimpan dalam folder yang sama dengan aplikasi itu sendiri, jika Anda menentukan self.directory seperti dalam kode saya, tetapi Anda dapat menentukan self.user_data_dir sehingga file ini tidak dihancurkan selama permutasi atau pembaruan.

Berjalan di windows & linux & makro


Prinsip untuk semua sistem operasi adalah sama:

  1. Kami menempatkan python3
  2. Kami menempatkan kivy
  3. Kami membuat file main.py dan menempelkan seluruh kode di atas ke dalamnya
  4. Dijalankan oleh tim

     python3 main.py 

Program harus bekerja.

Bangun file apk dan jalankan di ponsel dengan android


Jadi, kami memiliki file kode program yang ditulis dengan python. Bagaimana sekarang membuat aplikasi sehingga bisa diluncurkan di ponsel dengan android? Sebelumnya, itu adalah proses yang agak canggih yang membutuhkan keterampilan dan tarian dengan rebana. Sekarang ini bukan masalah.
Berikut ini adalah instruksi langkah demi langkah:

  1. Unduh mesin virtual siap pakai dari pengembang kivy, di mana semuanya sudah terkonfigurasi. https://github.com/Zen-CODE/kivybits/blob/master/KivyCompleteVM/ReadMe.txt . Kata sandi: kivy
  2. Kami meluncurkannya di Kotak Virtual.
  3. Buka terminal dan masukkan perintah berikut:

     #    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. Perintah terakhir membuat folder nampan di direktori yang sama, di nampan Anda akan menemukan file foodoptions-0.1-debug.apk, yang dapat Anda unggah ke ponsel Anda, instal dan nikmati aplikasi


Bagaimana cara mengunggah file apk ke ponsel?

Tentu saja, Anda dapat melakukannya sesuka Anda, mengirimkannya melalui pos, meletakkannya di suatu tempat, memasukkannya ke dalam telegram, dll., Lalu mengunduh aplikasi ke telepon Anda.

Tetapi ada alat khusus untuk ini. Kami mengaktifkan mode pengembang di telepon, sambungkan dengan kabel USB. Mesin virtual akan melihat bahwa Anda telah menghubungkan ponsel. Selanjutnya, pasang adb:

 sudo apt install adb 

Setelah instalasi, buka folder bin dan masukkan perintah

 adb install -r foodoptions-0.1-debug.apk 

Dan Anda dapat melihat aplikasi di telepon dalam waktu sekitar satu menit setelah kami melihatnya
Sukses di konsol.

 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$ 

Jika tiba-tiba aplikasi mogok atau tidak berfungsi seperti yang diharapkan, maka ada perintah untuk melihat kesalahan

 adb logcat| grep python 

Nama aplikasi Rusia

Jika Anda ingin aplikasi Anda dipanggil dalam bahasa Rusia, misalnya, "Makanan Harian", maka Anda perlu membuat perubahan pada file:

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

Nama aplikasi Rusia ditulis dalam tag appName, folder ini dibuat setelah peluncuran pertama debug android buildozer. Setelah mengedit file, kembali ke folder FoodOptions dan jalankan debug buildozer android lagi. File akan dikumpulkan dengan cara baru. Setelah instalasi di telepon, nama program akan ditulis dalam bahasa Rusia.

Tentang file buildozer.spec

Ini file github saya: buildozer.spec
File ini memberi tahu buildozer bagaimana tepatnya membangun paket.

Ada banyak variasi berbeda. Siapa yang peduli, lalu masukkan perintah di dalam mesin virtual:

 cd /tmp buildozer init 

File buildozer.spec default akan dibuat dengan banyak komentar dan penjelasan. Misalnya, jika Anda ingin beberapa ikon untuk aplikasi Anda, maka sebutkan di baris:

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

file Anda dengan ikon. Dan aplikasi akan sudah berkumpul dengan ikon Anda.

Jika Anda perlu memuat beberapa modul tertentu yang bukan bagian dari pustaka python resmi, maka ini dilakukan di baris requirement =. Secara umum, cerita tentang file buildozer.spec dapat mengambil seluruh artikel, atau bahkan dua.

Unduh aplikasi di Google Play

Penting untuk mendaftar, melalui semua prosedur, mendapatkan kunci. Dan kemudian jalankan:

 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 

File yang dihasilkan apk-apkname-release.apk diunggah ke Google Play.

Referensi



Pada prinsipnya, setiap orang yang dapat memprogram dengan python akan dapat mengubah aplikasi dan dengan mudah menambahkan yang berikut:

  1. Tambahkan desain untuk membuat aplikasi ini indah
  2. Gunakan file kv untuk membuat kode lebih mudah. Saya akan memberikan analogi: mereka yang akrab dengan pemrograman web, bayangkan kode tanpa template html dan template html. Menghapus tombol, layer dan hal-hal lain ke dalam file-kv adalah sesuatu seperti jinja2 untuk seorang programmer web. Logikanya tetap di file .py, dan pernak-pernik tetap di file kv.
  3. Tambahkan penghitungan kalori, protein, karbohidrat, lemak (BJU)
  4. Tambahkan kemampuan untuk memotret hidangan

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


All Articles