将python脚本打包为安卓应用——beeware简易教程

官方教程:https://docs.beeware.org/en/latest/tutorial/tutorial-0.html
本教程使用的系统为Windows11,python版本为3.7

需要科学上网

只能使用纯python模块,不能使用numpy等包含c的模块

只适用于一些小型程序,大程序不建议使用这个开发

也可以打包为Windows安装程序和iOS程序,但不在本文的介绍范围,不过也大同小异

安装依赖

  • 教程中建议使用python3.7或者更高版本,所以我使用conda创建了一个python3.7的虚拟环境canda create -n 环境名 python=3.7
  • 也可以不使用虚拟环境,但如果因模块冲突出现莫名其妙的错误可以试试使用虚拟环境能否解决
  • 安装git:https://git-scm.com/download/
  • 安装beeware的工具包:pip install briefcase
  • 创建项目

    这一步需要使用科学上网。
    在终端中可以使用命令set http_proxy=http://127.0.0.1:端口号set https_proxy=http://127.0.0.1:端口号使终端走代理。

    1. 在你想放置项目的文件夹中打开终端,如果使用虚拟环境的话并进入之前创建好的虚拟环境conda activate 环境名
    2. 使用命令briefcase new创建新beeware项目,会提示输入名称之类的一系列信息,初始测试时可以全部回车使用默认值。
      然后会自动使用git下载模板,如果不能科学上网的话会提示网络错误。(下载过一次之后再次创建时就不需要科学上网了,会使用之前下载过的)
    3. 然后会生成以项目名为名字的文件夹,里面会生成一个框架

      其中最重要的为使用红框框起来的两个文件
  • pyproject.toml:配置文件,如果你的程序中要使用requests等第三方库的话,需要配置这个文件。
  • app.py:主程序文件
    1. 运行初始项目测试配置
      在终端中进入刚才生成的文件夹(cd 文件夹名),然后使用命令briefcase dev启动项目,没有出错的话此时会弹出一个空白窗口

    融合你的项目

    初始项目例子

    打开初始的app.py,会看到

    import toga
    from toga.style import Pack
    from toga.style.pack import COLUMN, ROW
    
    class HelloWorld(toga.App):
        def startup(self):
            main_box = toga.Box()
    
            self.main_window = toga.MainWindow(title=self.formal_name)
            self.main_window.content = main_box
            self.main_window.show()
    
    def main():
        return HelloWorld()
    

    布局方式类似于HTML,使用盒子构建

    各个组件的例子

    下面是官方给出的第二个示例:
    只需要修改app.py中的类,别的都不需要修改

    class HelloWorld(toga.App):
        def startup(self):
        	# 主盒子
            main_box = toga.Box(style=Pack(direction=COLUMN))
    		
    		# 文本
            name_label = toga.Label(
                'Your name: ',
                style=Pack(padding=(0, 5))
            )
    		# 输入框
            self.name_input = toga.TextInput(style=Pack(flex=1))
    		
    		# 次盒子
            name_box = toga.Box(style=Pack(direction=ROW, padding=5))
            
            # 把上面定义的文本和输入框添加到盒子里
            name_box.add(name_label)
            name_box.add(self.name_input)
    		
    		# 按钮
            button = toga.Button(
                'Say Hello!',
                on_press=self.say_hello, # 按钮要调用的函数
                style=Pack(padding=5)
            )
    		
    		# 把次盒子和按钮放到主盒子里
            main_box.add(name_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 say_hello(self, widget):
            print("Hello", self.name_input.value)
    

    这个例子里使用了文本、输入框、按钮组件,只需要按需选择组件使用即可。

    要在程序运行过程中动态显示新组件,只需要创建新组建并放入盒子即可。

    使用第三方模块的例子

    例子中使用了requests模块

    只需要修改初始项目中的类

    class HelloWorld(toga.App):
    
        def startup(self):
            self.main_box = toga.Box(style=Pack(direction=COLUMN))
    
            button = toga.Button(
                'get',
                on_press=self.get_baidu, # 按钮要调用的函数
                style=Pack(padding=5)
            )
    
            self.main_box.add(button)
    
            self.main_window = toga.MainWindow(title=self.formal_name)
            self.main_window.content = self.main_box
            self.main_window.show()
        
        def get_baidu(self, widget):
            res = requests.get('https://www.baidu.com').text
    
            label = toga.Label(
                res,
                style=Pack(padding=(0, 5))
            )
    
            self.main_box.add(label)
    
    

    在Windows下运行测试

  • 还是使用briefcase dev命令
  • 别忘了安装requests模块:pip install requests
  • 在Windows下运行测试不需要配置前面提到的pyproject.toml,只需要保证使用pip安装了所需的模块。
  • 运行成功并点击按钮后结果如下图所示:

    生成安卓应用

    上面使用requests模块的程序在Windows下测试成功之后,就可以将其打包为安卓程序,下面以此为例。

    为了能够看到输出的日志,选择在虚拟机中运行(会自动下载并配置)

    配置依赖

    打开pyproject.toml,在第15行requires处和底部的安卓依赖部分添加使用的第三方模块(如果打包为其他平台的应用需要在对应的位置添加),本例使用了requests模块。其他需要用pip安装的模块都需要填在此处。

    首次运行

    第一次最好先修改配置文件然后再编译,否则最后一步运行时会报找不到模块的错误,若出现此错误可以在参考下面的修改后运行进行修复。

    1. 创建安卓应用:使用命令briefcase create android,首次运行时会下载 Java JDK 和 Android SDK。(这个似乎不需要科学上网)下载完成后会提示接受许可,一直输入y回车即可。
    2. 编译:briefcase build android,首次需要下载、运行一段时间。这一步生成了apk文件,位于打印出来的路径中。
    3. 运行:briefcase run android,第一次运行的时候只有一个选项:安装虚拟机,键入1并回车,然后回车使用默认名称即可。需要一段时间下载。

    运行并点击按钮后效果如下图所示

    修改后运行

    1. 使用了新的第三方模块:

    2. pyproject.toml中对应的两个位置添加新增模块
    3. 更新依赖配置:briefcase update android -d-d意思是更新依赖项
    4. 更新并运行:briefcase run android -d@beePhone -u-d@beePhone意思是使用上一步创建的虚拟机运行(没有使用默认名称的话需要修改名称),-u的意思是更新并重新编译
    5. 修改了代码:

    6. 不需要更新依赖配置
    7. 更新并运行:briefcase run android -d@beePhone -u

    在虚拟机上运行成功之后,就可以把安装包发送到手机上安装运行了。

    安装包在android\gradle\Hello World\app\build\outputs\apk\debug\app-debug.apk

    可能遇到的bug

    1. 有模块没有找到
      参考 修改后运行 的第一条

    2. 还有一个忘了,等想起来再补上。。

    来源:喝牛奶的草履虫

    物联沃分享整理
    物联沃-IOTWORD物联网 » 将python脚本打包为安卓应用——beeware简易教程

    发表评论