使用Python编写简单安卓应用

本文将会介绍如何使用BeeWare模块和Python代码来开发安卓应用。

一般,我们使用Java语言来开发安卓应用,开发体系成熟,工具繁多,流程规范。但对于不懂Java的人,该怎么使用Python语言来开发安卓应用呢?

在Python中,也提供了一些工具可以用来开发安卓应用,比如Kivy, BeeWare等。

本文将会介绍如何使用BeeWare工具来开发示例的安卓应用。

介绍

BeeWare 并不是一个单独的产品、工具或库,它是一系列工具和库的集合:每个工具和库都能协同工作,帮助您编写跨平台、具有本地图形用户界面的Python 应用程序。它包括:

  • Toga,一个跨平台的 widget (小部件,控件) 工具包;

  • Briefcase,一个用于将Python项目打包为可分发的成品,可以发送给最终用户的工具;

  • 库(如 Rubicon ObjC),用于访问平台原生库的库;

  • 预编译的Python构建版本,可在官方Python安装程序不可用的平台上使用。

在这个教程中,我们将使用所有这些工具,但作为用户,你只需要与前两个(Toga和Briefcase)互动。然而,每个工具也可以单独使用。例如,你可以使用Briefcase部署应用程序,而不使用Toga作为GUI工具包。

BeeWare套件可用于:macOS、Windows、Linux;在移动平台如Android和iOS;以及Web上,实现了「一次编写,处处部署」,平台移植能力强。

本文将会重点介绍如何使用BeeWare套件,将Python程序打包为Android App.

安装

安装briefcase:

1
pip install briefcase

创建应用

使用briefcase new创建一个应用,需要输入 应用的正式名称(比如:TimeTeller)、应用程序名称、域名、项目名称等信息,一般选择默认配置即可。同时,安装toga模块,该模块可以支持IOS/安卓应用开发。

创建的Python项目名称为timeteller,切换至该项目。此时项目结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ tree .
.
├── CHANGELOG
├── LICENSE
├── README.md
├── pyproject.toml
├── src
│   └── timeteller
│   ├── __init__.py
│   ├── __main__.py
│   ├── app.py
│   └── resources
│   └── README
└── tests
├── __init__.py
├── test_app.py
└── timeteller.py

5 directories, 11 files

app.py脚本用于实现安卓应用程序的功能,我们将代码调整如下,使其支持依据时区显示时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""
The application for telling time
"""

import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
import pytz
import datetime


class TimeTeller(toga.App):
def startup(self):
"""Construct and show the Toga application.

Usually, you would add your application to a main content box.
We then create a main window (with a name matching the app), and
show the main window.
"""
main_box = toga.Box()

location_label = toga.Label("Your location: ", style=Pack(padding=(0, 5)))
self.location_input = toga.TextInput(style=Pack(flex=1))
location_box = toga.Box(style=Pack(direction=ROW, padding=5))
location_box.add(location_label)
location_box.add(self.location_input)

button = toga.Button("Tell Me Time!", on_press=self.tell_time, style=Pack(padding=5))
main_box.add(location_box)
main_box.add(button)

self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()

def tell_time(self, widget):
location = self.location_input.value
location_dict = {"上海": "Asia/Shanghai",
"Shanghai": "Asia/Shanghai",
"shanghai": "Asia/Shanghai",
"sh": "Asia/Shanghai",
"SH": "Asia/Shanghai",
"东京": "Asia/Tokyo",
"Tokyo": "Asia/Tokyo",
"tokyo": "Asia/Tokyo",
"伦敦": "Europe/London",
"London": "Europe/London",
"london": "Europe/London",
"纽约": "America/New_York",
"New York": "America/New_York",
"new york": "America/New_York",
"NY": "America/New_York"}
loc = location_dict.get(location, "Asia/Shanghai")
self.main_window.info_dialog(
location, datetime.datetime.now(tz=pytz.timezone(loc)).strftime("%Y-%m-%d %H:%M:%S %A")
)


def main():
return TimeTeller()

调试

在Windows、MacOS或Linux系统中可以对上述应用程序进行用户界面调试,使用命令为:briefcase dev,界面如下:

GUI界面

配置调整

在打包之前,有一点需要重点强调。我们的应用程序中,用到了Python的第三方模块pytz,因此在打包前需要将该模块加入至安卓配置中。对项目中的pyproject.toml文件内的[tool.briefcase.app.timeteller.android]配置进行修改,如下:

1
2
3
4
5
[tool.briefcase.app.timeteller.android]
requires = [
"toga-android~=0.4.0",
"pytz~=2023.3",
]

如果在项目开发中没有用到Python第三方模块,则可略过上述配置过程,使用默认配置即可,但一般我们的Python项目都会用到第三方模块。

打包

上述GUI界面功能验证OK,我们需要将上述项目打包为安卓应用。

创建应用:

1
briefcase create android

构建安卓应用:

1
briefcase build android

打包时间为12m 36s,打包后的文件路径为: Built android-debug.apk ,文件大小为40.4MB。初次打包时耗时较长,后续打包耗时会比较短,基本在一分钟内即可完成打包。本文是在自己的Mac电脑上打包的,当然也可以在Windows或Linux系统中打包。

这样就得到了我们所需的安卓应用包,格式为apk,可以直接在手机上进行安装。

创建完后,可以在电脑端使用安卓虚拟器进行应用测试。本文将略过这个步骤,直接在手机上安装该App,并进行功能测试。

初始界面
时间显示界面

其它例子

在上述的例子中,我们创建了一个名为TimeTeller的应用程序,使用Python代码开发,利用BeeWare工具将其打包为安卓应用,并测试了功能实现是正常的。

接下来,我们将开发一个WordSegment的安卓App,用于将用户输入的句子进行中文分词。打包的完整流程与之前类似,app.py实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
"""
the application for Chinese Word segment.
"""

import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
import jieba


class WordSegment(toga.App):
def startup(self):
"""Construct and show the Toga application.

Usually, you would add your application to a main content box.
We then create a main window (with a name matching the app), and
show the main window.
"""
main_box = toga.Box()

sentence = toga.Label("句子: ", style=Pack(padding=(0, 10)))
self._input = toga.TextInput(style=Pack(flex=1))
input_box = toga.Box(style=Pack(direction=ROW, padding=10))
input_box.add(sentence)
input_box.add(self._input)

button = toga.Button("提交", on_press=self.segment, style=Pack(padding=10))
main_box.add(input_box)
main_box.add(button)

self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()

def segment(self, widget):
self.main_window.info_dialog(
"分词结果",
"/".join(jieba.cut(self._input.value, cut_all=False))
)


def main():
return WordSegment()

App效果如下:

中文分词应用

总结

本文介绍了如何使用BeeWare模块和Python代码来开发安卓应用,演示了TimeTeller应用程序的完整打包流程,并介绍了一个更有趣的应用:WordSegment(中文分词)应用。

本文所演示的TimeTeller项目已上传至Github,网址为:https://github.com/percent4/TimeTeller_in_Android .

参考文献

  1. BeeWare 教程: https://docs.beeware.org/zh-cn/latest/index.html
  2. 用 Python 编写安卓 APK ,简单几步搞定:https://zhuanlan.zhihu.com/p/398126847

使用Python编写简单安卓应用
https://percent4.github.io/使用Python编写简单安卓应用/
作者
Jclian91
发布于
2024年6月19日
许可协议