一文搞懂如何使用Python语言开发Android应用?

如何使用Python开发Android应用?

Python可以通过多种方式开发Android应用。以下是主要的几种方法,每种方法我都会提供两个案例。

方法一:使用Kivy框架

Kivy是一个开源的Python库,用于开发多平台应用,包括Android。

案例1:简单的Kivy Android应用

# 安装Kivy: pip install kivy

from kivy.app import App  # 导入Kivy应用基类
from kivy.uix.button import Button  # 导入按钮控件
from kivy.uix.boxlayout import BoxLayout  # 导入盒式布局
from kivy.uix.label import Label  # 导入标签控件

class MyApp(App):  # 创建应用类,继承自App
    def build(self):  # 实现build方法,返回应用的根控件
        layout = BoxLayout(orientation='vertical')  # 创建垂直盒式布局
        
        self.label = Label(text='Hello World')  # 创建标签控件
        layout.add_widget(self.label)  # 将标签添加到布局
        
        button = Button(text='Click Me!')  # 创建按钮控件
        button.bind(on_press=self.on_button_press)  # 绑定按钮点击事件
        layout.add_widget(button)  # 将按钮添加到布局
        
        return layout  # 返回布局作为根控件
    
    def on_button_press(self, instance):  # 按钮点击事件处理函数
        self.label.text = 'Button Clicked!'  # 改变标签文本

if __name__ == '__main__':  # 如果是直接运行此脚本
    MyApp().run()  # 创建应用实例并运行

案例2:Kivy带多个交互控件的应用

from kivy.app import App  # 导入Kivy应用基类
from kivy.uix.boxlayout import BoxLayout  # 导入盒式布局
from kivy.uix.textinput import TextInput  # 导入文本输入框
from kivy.uix.button import Button  # 导入按钮控件
from kivy.uix.label import Label  # 导入标签控件

class LoginScreen(BoxLayout):  # 创建登录界面类,继承自盒式布局
    def __init__(self, **kwargs):  # 初始化方法
        super(LoginScreen, self).__init__(**kwargs)  # 调用父类初始化
        self.orientation = 'vertical'  # 设置布局方向为垂直
        self.padding = 50  # 设置内边距
        self.spacing = 20  # 设置控件间距
        
        self.add_widget(Label(text='Username'))  # 添加用户名标签
        self.username = TextInput(multiline=False)  # 创建单行文本输入框
        self.add_widget(self.username)  # 添加用户名输入框
        
        self.add_widget(Label(text='Password'))  # 添加密码标签
        self.password = TextInput(password=True, multiline=False)  # 创建密码输入框
        self.add_widget(self.password)  # 添加密码输入框
        
        self.login_btn = Button(text='Login')  # 创建登录按钮
        self.login_btn.bind(on_press=self.login)  # 绑定登录按钮点击事件
        self.add_widget(self.login_btn)  # 添加登录按钮
        
        self.result_label = Label(text='')  # 创建结果标签
        self.add_widget(self.result_label)  # 添加结果标签
    
    def login(self, instance):  # 登录方法
        username = self.username.text  # 获取用户名
        password = self.password.text  # 获取密码
        
        if username == 'admin' and password == 'password':  # 检查用户名和密码
            self.result_label.text = 'Login successful!'  # 登录成功
        else:
            self.result_label.text = 'Login failed!'  # 登录失败

class MyApp(App):  # 创建应用类
    def build(self):  # 实现build方法
        return LoginScreen()  # 返回登录界面实例

if __name__ == '__main__':  # 如果是直接运行此脚本
    MyApp().run()  # 创建应用实例并运行

方法二:使用BeeWare框架

BeeWare是另一个用于创建原生跨平台应用的Python框架。

案例1:简单的BeeWare应用

# 安装BeeWare: pip install briefcase

import toga  # 导入toga库,BeeWare的GUI工具包
from toga.style import Pack  # 导入样式包
from toga.style.pack import COLUMN  # 导入列布局常量

def button_handler(widget):  # 按钮事件处理函数
    print("Hello World!")  # 打印消息到控制台
    widget.window.info_dialog('Information', 'Hello World!')  # 显示信息对话框

def build(app):  # 构建应用界面
    box = toga.Box(style=Pack(direction=COLUMN))  # 创建垂直布局的盒子
    
    button = toga.Button(  # 创建按钮
        'Click me!',  # 按钮文本
        on_press=button_handler,  # 按钮点击事件处理
        style=Pack(padding=10)  # 按钮样式,设置内边距
    )
    
    box.add(button)  # 将按钮添加到盒子
    
    return box  # 返回盒子作为界面

def main():  # 主函数
    return toga.App(  # 返回应用实例
        'First App',  # 应用名称
        'org.beeware.helloworld',  # 应用标识符
        startup=build  # 启动时构建界面
    )

if __name__ == '__main__':  # 如果是直接运行此脚本
    main().main_loop()  # 创建应用并进入主循环

案例2:BeeWare计算器应用

import toga  # 导入toga库
from toga.style import Pack  # 导入样式包
from toga.style.pack import COLUMN, ROW  # 导入布局常量

class Calculator:  # 计算器类
    def __init__(self):  # 初始化方法
        self.current_input = ''  # 当前输入
        self.result = 0  # 计算结果
        self.operation = None  # 当前操作
    
    def add_digit(self, digit):  # 添加数字
        self.current_input += str(digit)  # 将数字添加到当前输入
    
    def set_operation(self, op):  # 设置操作
        if self.current_input:  # 如果有当前输入
            self.result = float(self.current_input)  # 将当前输入转换为浮点数
            self.current_input = ''  # 清空当前输入
        self.operation = op  # 设置操作类型
    
    def calculate(self):  # 执行计算
        if self.operation and self.current_input:  # 如果有操作和当前输入
            num = float(self.current_input)  # 将当前输入转换为浮点数
            
            if self.operation == '+':  # 加法操作
                self.result += num  # 执行加法
            elif self.operation == '-':  # 减法操作
                self.result -= num  # 执行减法
            elif self.operation == '*':  # 乘法操作
                self.result *= num  # 执行乘法
            elif self.operation == '/':  # 除法操作
                if num != 0:  # 除数不能为零
                    self.result /= num  # 执行除法
            
            self.current_input = str(self.result)  # 将结果设置为当前输入
            self.operation = None  # 清空操作类型
            
        return self.current_input  # 返回当前输入

def build(app):  # 构建应用界面
    calculator = Calculator()  # 创建计算器实例
    display = toga.TextInput(readonly=True, style=Pack(flex=1, padding=5))  # 创建只读文本框
    
    def update_display():  # 更新显示
        display.value = calculator.current_input or str(calculator.result)  # 设置显示值
    
    def digit_handler(digit):  # 数字按钮处理
        return lambda widget: (  # 返回处理函数
            calculator.add_digit(digit),  # 添加数字
            update_display()  # 更新显示
        )
    
    def operation_handler(op):  # 操作按钮处理
        return lambda widget: (  # 返回处理函数
            calculator.set_operation(op),  # 设置操作
            update_display()  # 更新显示
        )
    
    def equals_handler(widget):  # 等号按钮处理
        calculator.calculate()  # 执行计算
        update_display()  # 更新显示
    
    # 创建按钮网格
    buttons = [
        ['7', '8', '9', '/'],
        ['4', '5', '6', '*'],
        ['1', '2', '3', '-'],
        ['0', '.', '=', '+']
    ]
    
    main_box = toga.Box(style=Pack(direction=COLUMN))  # 创建主盒子(垂直布局)
    main_box.add(display)  # 添加显示框
    
    for row in buttons:  # 遍历按钮行
        row_box = toga.Box(style=Pack(direction=ROW))  # 创建行盒子(水平布局)
        for button_text in row:  # 遍历行中的按钮
            if button_text.isdigit() or button_text == '.':  # 如果是数字或小数点
                btn = toga.Button(  # 创建数字按钮
                    button_text, 
                    on_press=digit_handler(button_text),  # 绑定数字处理函数
                    style=Pack(flex=1, padding=5)  # 设置样式
                )
            elif button_text == '=':  # 如果是等号
                btn = toga.Button(  # 创建等号按钮
                    button_text, 
                    on_press=equals_handler,  # 绑定等号处理函数
                    style=Pack(flex=1, padding=5)  # 设置样式
                )
            else:  # 如果是操作符
                btn = toga.Button(  # 创建操作符按钮
                    button_text, 
                    on_press=operation_handler(button_text),  # 绑定操作处理函数
                    style=Pack(flex=1, padding=5)  # 设置样式
                )
            row_box.add(btn)  # 将按钮添加到行盒子
        main_box.add(row_box)  # 将行盒子添加到主盒子
    
    return main_box  # 返回主盒子

def main():  # 主函数
    return toga.App(  # 返回应用实例
        'Calculator',  # 应用名称
        'org.beeware.calculator',  # 应用标识符
        startup=build  # 启动时构建界面
    )

if __name__ == '__main__':  # 如果是直接运行此脚本
    main().main_loop()  # 创建应用并进入主循环

方法三:使用P4A(Python for Android)

P4A是一个专门用于将Python应用打包成Android APK的工具。

案例1:简单的P4A应用

# 需要安装p4a: pip install python-for-android

from android.permissions import request_permissions, Permission  # 导入Android权限相关
from jnius import autoclass  # 导入jnius用于访问Java类

# 获取Android API类
PythonActivity = autoclass('org.kivy.android.PythonActivity')  # 获取PythonActivity类
Intent = autoclass('android.content.Intent')  # 获取Intent类
Uri = autoclass('android.net.Uri')  # 获取Uri类

def open_webpage(url):  # 打开网页函数
    intent = Intent()  # 创建Intent对象
    intent.setAction(Intent.ACTION_VIEW)  # 设置动作为查看
    intent.setData(Uri.parse(url))  # 设置数据为URL
    PythonActivity.mActivity.startActivity(intent)  # 启动Activity

# 请求权限
request_permissions([Permission.INTERNET])  # 请求互联网权限

# 应用主代码
from kivy.app import App  # 导入Kivy应用基类
from kivy.uix.button import Button  # 导入按钮控件
from kivy.uix.boxlayout import BoxLayout  # 导入盒式布局

class MyApp(App):  # 创建应用类
    def build(self):  # 实现build方法
        layout = BoxLayout(orientation='vertical')  # 创建垂直布局
        
        btn1 = Button(text='Open Google')  # 创建打开Google按钮
        btn1.bind(on_press=lambda x: open_webpage('https://www.google.com'))  # 绑定打开网页事件
        layout.add_widget(btn1)  # 添加按钮到布局
        
        btn2 = Button(text='Open GitHub')  # 创建打开GitHub按钮
        btn2.bind(on_press=lambda x: open_webpage('https://www.github.com'))  # 绑定打开网页事件
        layout.add_widget(btn2)  # 添加按钮到布局
        
        return layout  # 返回布局

if __name__ == '__main__':  # 如果是直接运行此脚本
    MyApp().run()  # 创建应用实例并运行

案例2:P4A使用Android原生功能

from android.permissions import request_permissions, Permission  # 导入Android权限相关
from jnius import autoclass  # 导入jnius用于访问Java类

# 获取Android API类
PythonActivity = autoclass('org.kivy.android.PythonActivity')  # 获取PythonActivity类
Context = autoclass('android.content.Context')  # 获取Context类
Vibrator = autoclass('android.os.Vibrator')  # 获取Vibrator类
Toast = autoclass('android.widget.Toast')  # 获取Toast类

def make_toast(message):  # 显示Toast消息
    activity = PythonActivity.mActivity  # 获取当前Activity
    Toast.makeText(  # 创建Toast
        activity,  # 上下文
        message,  # 消息内容
        Toast.LENGTH_SHORT  # 显示时长
    ).show()  # 显示Toast

def vibrate(duration=500):  # 振动函数
    activity = PythonActivity.mActivity  # 获取当前Activity
    vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)  # 获取振动服务
    if vibrator and vibrator.hasVibrator():  # 检查振动器是否存在且可用
        vibrator.vibrate(duration)  # 振动指定时长

# 请求权限
request_permissions([Permission.VIBRATE])  # 请求振动权限

# 应用主代码
from kivy.app import App  # 导入Kivy应用基类
from kivy.uix.button import Button  # 导入按钮控件
from kivy.uix.boxlayout import BoxLayout  # 导入盒式布局

class MyApp(App):  # 创建应用类
    def build(self):  # 实现build方法
        layout = BoxLayout(orientation='vertical')  # 创建垂直布局
        
        # 创建显示Toast按钮
        toast_btn = Button(text='Show Toast')  # 创建按钮
        toast_btn.bind(on_press=lambda x: make_toast('Hello from Python!'))  # 绑定显示Toast事件
        layout.add_widget(toast_btn)  # 添加按钮到布局
        
        # 创建振动按钮
        vibrate_btn = Button(text='Vibrate')  # 创建按钮
        vibrate_btn.bind(on_press=lambda x: vibrate(800))  # 绑定振动事件
        layout.add_widget(vibrate_btn)  # 添加按钮到布局
        
        # 创建组合功能按钮
        combo_btn = Button(text='Toast and Vibrate')  # 创建按钮
        combo_btn.bind(on_press=lambda x: [  # 绑定多个事件
            make_toast('Combined action!'),  # 显示Toast
            vibrate(300)  # 振动
        ])
        layout.add_widget(combo_btn)  # 添加按钮到布局
        
        return layout  # 返回布局

if __name__ == '__main__':  # 如果是直接运行此脚本
    MyApp().run()  # 创建应用实例并运行

打包为Android应用

要将Python代码打包成Android APK,可以使用Buildozer工具:

  1. 安装Buildozer:
    pip install buildozer
    
  2. 在项目目录中初始化Buildozer配置:
    buildozer init
    
  3. 编辑生成的buildozer.spec文件,配置应用信息
  4. 构建APK:
    buildozer android debug
    

总结

Python开发Android应用有多种方式:

  1. Kivy - 最流行的选择,提供丰富的UI组件和跨平台支持
  2. BeeWare - 追求原生外观和感觉,使用各平台原生控件
  3. P4A - 专门用于Android,可以访问更多Android原生功能

每种方法都有其优缺点,选择取决于项目需求:

· 如果需要快速开发跨平台应用,选择Kivy
· 如果需要原生外观和体验,选择BeeWare
· 如果需要深度集成Android功能,选择P4A

无论选择哪种方法,都可以使用Python开发功能完整的Android应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一剑的CS_DN博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值