如何使用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工具:
- 安装Buildozer:
pip install buildozer - 在项目目录中初始化Buildozer配置:
buildozer init - 编辑生成的buildozer.spec文件,配置应用信息
- 构建APK:
buildozer android debug
总结
Python开发Android应用有多种方式:
- Kivy - 最流行的选择,提供丰富的UI组件和跨平台支持
- BeeWare - 追求原生外观和感觉,使用各平台原生控件
- P4A - 专门用于Android,可以访问更多Android原生功能
每种方法都有其优缺点,选择取决于项目需求:
· 如果需要快速开发跨平台应用,选择Kivy
· 如果需要原生外观和体验,选择BeeWare
· 如果需要深度集成Android功能,选择P4A
无论选择哪种方法,都可以使用Python开发功能完整的Android应用。
1553

被折叠的 条评论
为什么被折叠?



