如果想使用 Python 语言编写图形界面程序,那么有不少的框架可以提供支持,比如 Kivy、Tkinter、PyQt、WxPython、pyui4win等等。
这些框架都是只能创建桌面图形界面程序,比如 Windows、Linux 和 macOS。
如果我们想要创建 IOS 或 Android 等平台的移动应用APP,它们就无能为力了。
那么 Python 能不能写移动应用APP呢?实际上是可以的。
Kivy 和 BeeWare 都宣称:一次编写,处处部署,基于这些个框架编写的图形界面程序,都能够打包为全平台的应用程序,比如:Windows、Linux、macOS、Android、IOS。
今天,我们就尝试使用一下 BeeWare 这个框架,编写一个图形界面程序,然后打包为一个安卓APP。
BeeWare 是一个基于 Python 构建的跨平台应用开发框架,其宣传:Write once. Deploy everywhere.
能够让 Python 编写的图形程序在 iOS, Android, Windows, MacOS, Linux, Web, 和 tvOS 上运行,看起来是很强大的。
BeeWare 安装完成之后,我们就可以通过briefcase
命令在命令行终端进行 BeeWare 应用的管理,比如新建、运行、构建、打包等等。
我们先使用命令briefcase new
创建一个应用。
命令输入之后,会让我们输入「应用的正式名称」、「应用程序名称」、「域名」、「项目名称」等等信息,在这里出于演示,我们统统使用默认值。
我们将应用程序打包为应用程序,我们在进行测试的时候会发现一些问题, 需要我们进行一些bug修复或者优化。即使应用程序是完美的,最终还是希望发布版本后, 需要具有改进功能的应用程序,那我们改怎么做呢?
当按下按钮时,我们的应用程序当前会打印到控制台。但是,GUI 应用程序不应该真正使用控制台进行输出。他们需要使用对话与用户进行交流。
添加一个对话框来打招呼,而不是写到控制台。修改say_hello回调,使其看起来像这样:
def say_hello(self, widget):
self.main_window.info_dialog(
'Hello, {}'.format(self.name_input.value),
'Hi there!'
)
这会指示 Toga 在按下按钮时打开一个模式对话框。
如果你运行,输入一个名字,然后按下按钮,你会看到新的对话框:briefcase dev
但是,如果运行,则不会出现该对话框。briefcase run
为什么是这样?好吧,通过在适当的位置运行你的代码来运行 - 它试图为你的代码生成尽可能真实的运行时环境,但它不提供或使用任何平台基础结构来将你的代码包装为应用程序。打包你的应用程序的部分过程涉及将你的代码复制到应用程序包中 - 目前,你的应用程序中仍然包含旧代码。briefcase dev
所以 - 我们需要告诉公文包复制新版本的代码。我们 可以通过删除旧的平台目录并从头开始来做到这一点。但是,公文包提供了一种更简单的方法 - 你可以更新现有捆绑应用程序的代码:
如果 Briefcase 找不到脚手架模板,它会自动调用 create生成一个新的脚手架。
现在我们已经更新了安装程序代码,然后我们可以运行 重新编译的应用程序,运行更新的应用程序,并重新打包应用程序以进行分发。briefcase build
briefcase run
briefcase package
如果你正在快速迭代代码更改,可能希望更改代码、更新应用程序并立即重新运行你的应用程序。公文包有一个支持这种使用模式的快捷方式 -命令上的-u
(或 --update
) 选项run
。
让我们尝试进行其他更改。你可能已经注意到,如果你不在文本输入框中键入名称,对话框将显示“您好,”。让我们say_hello
再次修改 函数以处理这种边缘情况:
def say_hello(self, widget):
if self.name_input.value:
name = self.name_input.value
else:
name = 'stranger'
self.main_window.info_dialog(
'Hello, {}'.format(name),
'Hi there!'
)
在开发模式下运行你的应用程序(使用)以确认新逻辑有效;然后使用一个命令更新、构建和运行应用程序:briefcase dev
仅当你正在测试有关你的应用程序如何作为本机二进制文件运行的内容时,或寻找仅在你的应用程序处于打包形式时才会出现的错误时,才需要这样做。对于大多数日常开发, 会快很多。briefcase dev
package 命令也接受该-u
参数,因此如果你对应用程序代码进行更改并希望立即重新打包,你可以运行 .briefcase package -u