本文将会介绍如何使用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
:
创建应用
使用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 togafrom toga.style import Packfrom toga.style.pack import COLUMN, ROWimport pytzimport datetimeclass 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
构建安卓应用:
打包时间为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 togafrom toga.style import Packfrom toga.style.pack import COLUMN, ROWimport jiebaclass 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
.
参考文献
BeeWare 教程: https://docs.beeware.org/zh-cn/latest/index.html
用 Python 编写安卓 APK
,简单几步搞定:https://zhuanlan.zhihu.com/p/398126847