搜尋感興趣的網誌

所有文章連結

2022年5月29日 星期日

Python Kivy 使用buildozer打包.apk

 

當我們的APP都編譯好測試完,接下來就要打包成.apk並放在手機上進行安裝測試,打包小雷是用buildozer進行,流程會稍微繁雜一點,但前置作業操作一次之後,後面就比較沒有那麼花時間了

 

畢竟是用windows系統,所以需要使用linux子系統進行打包作業,所需的軟體與配置方式一一會進行介紹,以下是會需要的幾個網站 :

1.      Wsl : https://docs.microsoft.com/en-us/windows/wsl/install,使用Linux Windows子系統來安裝linux的發行版

2.      Sdk管理器 : https://developer.android.com/studio/releases/platform-tools#downloads

3.      Buildozer : https://buildozer.readthedocs.io/en/latest/installation.html

4.      Ubuntu : linux的發行版,讓我們在windows上操作

5.      Window power shell : 安裝ubuntu、連接手機,開啟adb server

 

一開始需要呼叫出windows power shell,執行 >> 輸入power就可以找到,點右鍵選擇以管理員身分執行,開啟後的頁面就如下方所示




輸入 >> wsl --install -d Ubuntu進行ubuntu的安裝,可以輸入wsl –list確認一下有哪些版本有發布的



安裝完成後會自動開啟ubuntu,第一次使用需要註冊使用者,只要輸入使用者名稱與密碼(這個密碼不會顯示,所以要自己慢慢輸入確認),完成後的頁面以下所示,接著移動到我們的檔案資料夾,cd之後的寫法與一般不太一樣,輸入 >>   cd /mnt/檔案位置


再來我們需要去下載sdk管理器下載下载适用于 Windows SDK Platform-Tools,開啟後請將adb.exeAdbWinApi.dllAdvWinUsbApi.dll複製到APP的資料夾中




完成後要開始安裝buildozer,以下都是在ubuntu中操作,第一次安裝流程如下

輸入sudo apt update >> 輸入密碼後進行更新

輸入sudo apt install python3-pip >> 安裝pythonpip功能

輸入pip3 install --user --upgrade buildozer

輸入sudo apt install -y git zip unzip openjdk-13-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev

輸入pip3 install --user --upgrade Cython==0.29.19 virtualenv

輸入export PATH=$PATH:~/.local/bin/







都跑完後要來安裝adb,輸入sudo apt install adb,完成後可以輸入adb –version進行版本查詢



再來就是初始化,輸入buildozer init,資料夾中會出現一個buildozer.spec的文字檔案


打開後裡面是APP我們可以調整的地方,主檔案與其他圖片都要放到同一個資料夾中,以下是調整之處 : 

title = 出現在手機上的APP名稱

package.name = 打包後的.apk名稱,僅能小寫

source.include_exts = py,png,jpg,kv,atlas,otf(會需要使用的副檔名)

requirements = python3,kivy,requests

presplash.filename = APP打開的起始圖片,副檔名.png

icon.filename = 出現在手機桌面的icon圖示,副檔名.png

author = Copyright © 2022 作者名稱

version = 版本號碼

android.presplash_color = 起始頁的背景顏色(十六進位碼)



接著要開始進行除錯,請將手機連結電腦,手機要開啟usb偵錯與傳輸檔案模式,接著我們使用power shell開啟adb服務與連接手機,移動到檔案位置後輸入  ./adb start-server,完成後輸入 ./adb devices,注意斜線之前有一個逗點 ” . ” ,連接後可以看見power shell顯示連接的編碼



回到ubuntu中輸入buildozer –v android debug,待除錯完成後,.apk檔案會出現在bin資料夾裡面


到這邊就可以將apk檔案傳輸至手機進行安裝測試,說真的流程不少,但跑過一次之後,同一個檔案要打包只需要power shell連接手機後ubuntu 進行除錯即可,完整程式碼與apk檔案連結如下 : 

程式碼 : 點我連結github

Apk檔案 : 點我連結雲端























Python Kivy APP介紹 – 下

 

上篇稍微介紹了kivy的優勢與實作APP的一些想法,這篇延續kivy的介紹,讓一開始接觸的朋友比較有個概念,kivy有自己的官網,裡面介紹的很詳細,包含第一次製作APP(每個都是從hello world開始),到所有的部件使用與kv file寫法,APP最主要的就是一開始的layout(布局),所有的功能鍵(buttonlabel)都是層疊在各個布局之上,最簡單是從一個布局開始,多個布局如果可以使用kv語言來寫,我想會相對簡單許多,只是要多花心思去研究kv語言的特徵。

 

以下稍微列舉幾個常見的kivy layout :

AnchorLayout : 小部件(kivy documentation是寫widgets)可以選擇放的位置是上下左右或是中間,這些部件是由x,y進行位置標定。


BoxLayout : 部件按照垂直或是水平方向進行排序,不需要用到xy軸,對於部件的大小以及版面的縮放控制相對上比較繁雜。


FloatLayout : 所有的部件都是可以隨意放置,靈活性非常好,位置的擺放就要有相當程度的概念。


GridLayout : 部件擺放的方式經由rowscols定義的網格排列。


PageLayout : 可以向翻書一樣的建立多個頁面的布局模式。


部件的部分基本上會使用到以下幾個

Label : 標籤欄位,顯示訊息

Button : 按鈕,寫入添加需要的功能

Textinput : 產生輸入框

Image : 匯入圖片

 

最後就是kivy可以控制手機的功能,包含手機陀螺儀、相機、鍵盤、多點觸控等等,有興趣的朋友也可以上kivydocumentation去查看。





Python Kivy APP介紹 - 上


小雷近期跟朋友閒聊(做傳直銷業)時被問到如何管理以及營運一個團隊會比較好,雖然我並不是做傳直銷的人,但是聊到他們的運作模式,其實分析下來跟管理一個業務部門有點類似,差異在於一般業務部門是所屬公司員工,傳直銷所謂的直銷商屬於個人業務,業務不外乎開發人脈,銷售商品,只是他們還多了可以自組團隊運作(直屬上下都是有利益關係的),有沒有甚麼方式可以透過我目前的技能像是分析或是編程去幫助他們的呢?

 

從行業、運作模式,到選定解決方式我的方式如下

1.      觀察 : 包含流程運作,行業別與其他行業操作模式,訓練方式,洽談方式宇等。

2.      分析 : 流程所需時間是否過久?訓練與洽談方式是否可以複製?這個行業語其他行業差異多少?

3.      需要解決的事項 : 教育訓練有太多講座,在訓練與洽談時花費了太多時間,這個行業在年齡上有很大的落差,擁有很多商品、使用方式等等的文件,最複雜的就是每個人講解所謂獎金的方式沒有辦法統一,計算出來的數字也有差異,需要簡化流程與縮短時間。

4.      解決方式 :  初步的想法是設計一個計算的APP,將大部分不熟悉計算的公式寫入,並且製作一個資訊網頁,將需要的文件放置變更為線上撰寫文件與送出,壓縮掉不必要的文件改成雲端運作。

所以,需要一個APP可以安裝在手機或者平板,去實現輕量化與雲端化的作業方式,但是平常聽到APP好像都是Java去寫的,那Python是否可以寫APP??答案是有的,就是Kivy,文章之後都會圍繞著Kivy APP的實作。

 

簡單的介紹一下Kivy 的優勢 :

l   Kivy是開源Python的函式庫,用於開發行動應用程式(APP),可以在AndroidIOSWindowsOS X去跨平台執行,並且支援原生使用輸入、協議與設備。

l   針對使用效能的部分使用的是OpenGLES2,使用起來非常的快速,所有的部件都有高度的擴展性,所以可以寫遊戲、繪圖、執行手機的控制等等,非常的多樣化。

l   Kivy有自己的一套語言,可以定義好LabelButtonLayout後寫成.kv文件匯入Python去執行,而且,Kivy免費的,可以做商業用途!

若是不想寫kv file,也可以完全以Python去寫沒有問題,只是網路上資料會比較難找,小雷這次做的就是完全以Python去寫,沒有.kv file,原因在於我並不是專業的APP開發人員,所以並不會一直去使用kv語言,還是會專心於數據分析的領域,但是可以用Python寫出來對於熟悉Python也是個好事。

 


這系列的實作文章也會介紹一下打包的方式,雖然流程有點繁雜,但是跑一次之後就比較輕鬆了,小雷寫出來的APP也會打包成.apk放到雲端供有需要參考的人下載,雖然不是甚麼大神寫的,若有幫助到其他人就太棒了。





python kivy app實作計算APP - 下

 

上篇把開頭都處理的差不多了,這篇開始要寫完整個APP,其中滾動的布局處理是花最多時間的,原因有兩個 :

1.      布局不管是GridLayout還是BoxLayout,都是單一方向,GridLayout是網格狀,方向無法控制,只能依照一開始定義多少的colsrows去排列。

2.      BoxLayout則是僅能設定直式或是橫式,第一行的格式大小方式,在第二行時無法使用變更,會產生錯誤或是全部不見,所以遇到下面的圖形排列時,就會無法處理,這部分若是使用kv file可以很方便的解決,網路上的資訊幾乎都是以kv file形式解決,但小雷一開始就打算完全使用Python,所以也花了不少時間去研究。


最後解決的辦法就是創造一個主要的GridLayout以及好幾個橫式的BoxLayout,分別把各個函式套用進去之後再添加回主要的布局之中,總算是不會衝突並且可以正常執行,滾動的scrollview要注意size_hint_y必須是None,才能正常滾動,只要設定值不是None,整個滾動頁面就會產生錯誤甚至閃退

# 建立滾動處
    def create_scrollview(self):
        # 主要布局
        self.layout = GridLayout(cols=1, size_hint_y=None)
        self.layout.spacing = 20
        self.layout.bind(minimum_height=self.layout.setter("height"))
 
        # 橫向布局_0
        self.hori = BoxLayout(orientation="horizontal", size_hint_y=None)
        self.hori.spacing = 10
 
        # 橫向布局_1
        self.one_hori = BoxLayout(orientation="horizontal", size_hint_y=None)
        self.one_hori.spacing = 10
 
        # 橫向布局_2
        self.two_hori = BoxLayout(orientation="horizontal", size_hint_y=None)
        self.two_hori.spacing = 10


 接著處理要顯示的按鈕、標籤與輸入框,按照每一行對應的Layout進行添加

        # boxlayout
        self.one_button = MyButton(
            text="A方案",
            size_hint=(0.2, None))
        self.one_button.bind(on_press=self.one_info)
        self.hori.add_widget(self.one_button)
 
        self.two_button = MyButton(
            text="B方案",
            size_hint=(0.2, None))
        self.two_button.bind(on_press=self.two_info)
        self.hori.add_widget(self.two_button)
 
        self.three_button = MyButton(
            text="C方案",
            size_hint=(0.2, None))
        self.three_button.bind(on_press=self.three_info)
        self.hori.add_widget(self.three_button)
 
        self.four_button = MyButton(
            text="D方案",
            size_hint=(0.2, None))
        self.four_button.bind(on_press=self.four_info)
        self.hori.add_widget(self.four_button)

 

滾動到尾部時可以添加一些空白的Label,防止手機鍵盤彈出時不好打字,對於滾動的順暢度也會比較好

        # 增加的空格
        for i in range(10):
            self.test = Label(
                size_hint=(0.2, None)
            )
            self.layout.add_widget(self.test)

 

把滾動的函式添加回主要的Layout與要滾動的範圍

        # 導入滾動函式
        scrollview = ScrollView(size=(Window.width, Window.height))
        scrollview.add_widget(self.layout)
        self.window.add_widget(scrollview)


最後將所有的計算公式與回傳值編寫進函式,要顯示的文字編寫好與準備測試

# boxlayout
        self.one_button = MyButton(
            text="A方案",
            size_hint=(0.2, None))
        self.one_button.bind(on_press=self.one_info)
        self.hori.add_widget(self.one_button)
 
        self.two_button = MyButton(
            text="B方案",
            size_hint=(0.2, None))
        self.two_button.bind(on_press=self.two_info)
        self.hori.add_widget(self.two_button)

 

這邊需要注意幾件事情 :

1. 按鈕按下去之後,並不是依照按鈕上的文字去做傳輸,以one_button為例,雖然設定的文字是A方案,但實際列印出來的卻不是文字,所以輸出的時候要注意型態是否有正確

self.one_button = MyButton(
            text="A方案",
            size_hint=(0.2, None))
 
        print(self.one_button)
<__main__.MyButton object at 0x000001E3A4BB3C80>
 
        print(self.one.button.text)
A方案
 

2. 再來就是數字計算完成之後,要輸出到Label時需要轉換為字符chr,否則會產生錯誤,Label只接受字符

self.referral = 20 / 100
self.bouns_output = str(self.bouns_calculation)

3. 最後就是當按鈕或是文字沒有輸入時,APP會閃退,所以函式中可以善用try..except去檢測錯誤並給予回傳的值。

        # 獎金A判斷
        try:
            if self.bouns_output == str(self.bouns_calculation):
                self.bouns_calculation = self.bouns_calculation
            else:
                pass
        except:
            self.bouns_calculation = str("0")


到這邊已經APP本體已經完成了,剩下的就是打包成.apk並傳送到手機安裝進行測試啦!


python kivy app實作計算APP - 上

 

前面都有稍微介紹了kivy的優勢與大概想做的方向,所以這篇就開始進入了小雷這次的實作內容,完整的程式碼有放在Github.apk檔案則是放在雲端,有需要的朋友可以自行下載

 

基本的架構預想是長這樣子,其他功能目前還未實裝,就先預留著空位,一開始不想弄得太過於複雜,希望先以簡單的版型為主


一開始安裝kivy

pip install kivy

 

實作完的APP長的是這個樣子,希望以簡單乾淨,功能操作方便為主,所以沒有甚麼美化,需要特別注意的是,主檔案的名稱一定要是”main.py”,否則打包時會無法執行!

 


匯入需要的函式庫

ScrollView >> 頁面滾動

Config.set >> 手機控制的配置項目,keyboard_mode打字時需要顯示手機鍵盤

Webbrowser >> 開啟手機瀏覽器

from re import MULTILINE
from kivy.core.window import Window
from kivy.uix.scrollview import ScrollView
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.core.text import LabelBase
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
import webbrowser
from kivy.config import Config
Config.set('kivy', 'system', 'keyboard_mode')  # 控制手機系統與鍵盤

 

一開始有幾個設定需要預先處理,第一個是字體的問題,kivy並沒有支援繁體中文,所以需要準備一個要替換掉的字型檔案,跟main.py放在一起,程式碼需要放到最上方讓程式啟動時就執行載入

# 導入字體
LabelBase.register(
    # 系統字形
    name='Roboto',
    # 更換的字形
    fn_regular='NotoSansCJKtc-Regular.otf')

 

背景色的部分有替換掉原始的黑色,所以需要清除更換顏色,配色的部分採用的是RGBA,可以找找想替換的顏色,有些網站也提供轉換色碼

# 清除背景色
Window.clearcolor = (244, 221, 53, 1)

 

設定想要連到的網頁,點擊Button後開啟瀏覽器連結

def webLink(instance):
    # 連結的網址
    webbrowser.open("https://rexli01010629.wixsite.com/rex-li")

 

若是有統一規格的按鈕,標籤等也可以先設定好字體對齊方式、大小、背景色等

# 按鈕設定
class MyButton(Button):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 字體對齊、字形大小、背景色
        self.halign = 'center'
        self.font_size = self.width / 2
        self.background_color = '#00E3E3'

 

部件的設定有基本的步驟,設定所需部件(ButtonLabelText) > 綁定執行函式(bind) > 將部件添加到布局之中(add_widget)

On_press >> 按壓後要執行的函式

        self.top_right = Button(
            background_normal="link_one.png",
            background_down="link_two.png",
            size_hint=(1, 0.1)
        )
        self.top_right.bind(on_press=webLink)
        self.window.add_widget(self.top_right)

 

 

Kivy的程式碼中開始與執行APP並沒有想像中的複雜,開始與結尾執行的設置如下,同時也把要連結網頁與滾動的布局帶進去調用。

GridLayout >> 選擇的布局方式

Cols >> 需要多少欄位,若不是GridLayout就不是設置cols

Size_hint >> 這個Layout的大小設定,(x, y)1為最大

Spacing >> 部件的間隔多少pixel

Pos_hint >> dic的形式進行設定

Create_scrollview >> 調用滾動函式

# App主體
class CalculationApp(App):
    def build(self):
        # 設定主要面板布局
        self.window = GridLayout()
        # 設定欄位數
        self.window.cols = 1
        # Layout的大小設定
        self.window.size_hint = (0.8, 1)
        # 間隔
        self.window.spacing = 10
        # APP位置的定位
        self.window.pos_hint = {"center_x": 0.5, "center_y": 0.5}
 
        # 頂部的Button連結
        self.top_right = Button(
            background_normal="link_one.png",
            background_down="link_two.png",
            size_hint=(1, 0.1)
        )
        self.top_right.bind(on_press=webLink)
        self.window.add_widget(self.top_right)
 
        # 輸出位置
        self.outputresult = Label(
            text="Out put result \n 結果輸出處",
            font_size="55",  # 原始為60
            color='#000000',
            size_hint=(1, 0.5),
            pos_hint={"center_x": 0.5, "center_y": 0.2}
        )
        self.window.add_widget(self.outputresult)
        # 調用滾動
        self.create_scrollview()
 
        return self.window
 
# 執行
if __name__ == "__main__":
    CalculationApp().run()


執行的方式只要從終端機操作,就可以測試APP是否有錯誤






其他文章

看看精選文章

納希克房價分析 | Nashik Apartment Price Analyze – 語法解析(上)

  這次 Nashik 的房價分析有上傳至 Kaggle ,有興趣的朋友可以前往閱覽, RMarkdown PDF 報告存放在 Google 雲端,程式碼則是存放於 Github ,照慣例會分享好用的函式語法,雖說基本的 Packages 與語法可能很多人都會完整的閱覽,但是實際...