Python移动APP开发之Kivy(二)——第一个APP

这篇具有很好参考价值的文章主要介绍了Python移动APP开发之Kivy(二)——第一个APP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、APP代码书写

(一)单独在py中构建

(二)结合kv构建

二、Kivy打包

(一)、大致概述

(二)、Kivy打包Android的方式

(三)、开始打包

(四)、buildozer.spec详解

三、结语


之前简要介绍了Python的移动app开发框架Kivy的核心成员及主要原理和应用。从本篇开始会不定期发布Kivy开发代码和原理讲解。

依照开发界的惯例,先来个简单的Hello world起个好头。

一、APP代码书写

首先创建一个main.py文件,至于为什么命名为main是因为打包的时候Kivy框架会以main.py文件为核心进行打包而不是其他命名的文件。

(一)单独在py中构建

如果想直接在py文件中完成全部代码构成可以按照如下方式写代码:

from kivy.app import App  # 引入App库,App库是Kivy开发的核心,必须引入
from kivy.uix.button import Button    # 引入Button(按钮)控件
from kivy.uix.boxlayout import BoxLayout    # 引入布局


class IndexPage(BoxLayout):    # 自定义根布局名称,并继承对应类型的布局
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        button = Button(text="Hello world")    # 实例化Button控件,并修改text属性
        self.add_widget(button)    # 通过add_widget函数将Button控件引入布局中


class TestApp(App):    # 单独构建App导入框架
    def build(self):
        return IndexPage()    # 返回布局,相当于在软件中绘制布局及其中内容


TestApp().run()    # 运行软件

(二)结合kv构建

当然我们也可以把根布局下的所有控件写在单独的.kv文件中,首先 还是创建一个main.py文件。

这次与之前有所不同了,我们只需要在py文件中声明清楚根布局就可以了,其余的都可以在kv文件内完成。在py中的代码如下:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout


class IndexPage(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)


class TestApp(App):
    def build(self):
        return IndexPage()


TestApp().run()

 接下来创建一个kv文件,注意kv文件的命名要与引入App的类本身的名称当中,App之前的字段相对应,但Kivy会自动小写化App之前的字段,如:以上代码中引入App库的类名称为TestApp,那么在命名kv文件的时候就要命名为test.kv。固我们需要创建一个test.kv文件,并在其中编写如下代码(注:Kivy本身具备kv语言,与Python有所不同但同样语法简单易懂):

<IndexPage>:
    Button:
        text: 'Hello world'

注意:kv文件中要先确定父布局再在其下代码块中构建代码,其中根布局的声明较为特殊,如上代码中根布局名称为IndexPage便在kv文件中以<IndexPage>:的形式声明根布局,另外根布局的名称是由py文件中引入布局的类名称决定的,如:以上py文件中引入BoxLayout布局的类名称为IndexPage则在kv文件中声明根布局也必须是<IndexPage>否则Kivy无法找到对应的声明无法绘制出布局图形。py文件中不管引入什么布局,在kv文件中根布局的名称均由py文件中引入布局的类名称决定。

完成以上操作并运行就可以得到如图一个具备反馈按钮的窗口。kivy虚拟机镜像,python

 到这里算是写完一个最基础的App啦,接下来就是在Andorid手机上运行啦。

二、Kivy打包

在手机上运行有很多种方式,其中最简单的就是在谷歌应用市场下载Kivy Luncher软件在手机上直接运行App,但是想想在国内还想访问国外网站除非有企业通道不然别想,想了也很危险,况且,如果你真的用Kivy做出了一个APP项目到了发布的时候不可让别人再下载一个单独的软件来运行你的项目对吧?所以呢,我们就得通过打包的方法将我们写的代码打包成一个独立的APP。

(一)、大致概述

通过Kivy,我们可以打包Python代码为Windows、Andoid、IOS的可执行文件。当然我主要是针对Android打包,如果想了解其他的可以去看看官方文档。

(二)、Kivy打包Android的方式

Kivy打包Python代码主要有两种方式:通过Buildozer或者p4a(python-for-android),各有千秋,请自行决定,我这里主要是通过Buildozer完成打包,毕竟自动化环境搭建真的香。buildozer的虚拟机镜像已经给各位读者准备好啦(都是别人给搭建好的,咱拿来直接用,root密码:kivydev)

天翼云盘(不限速):https://cloud.189.cn/t/yqyQ3ueQBZVr (访问码:zbl4)

百度网盘:https://pan.baidu.com/s/1oycJ7Kn2NChq_5gSH8IXew?pwd=y5n9 提取码:y5n9

下载好后直接解压就行,点击001后缀进入之后解压.ova后缀文件就行。解压之后自行导入ova虚拟机镜像进入VirtualBox,不会的可以点击这里。VirtualBox不会安装的可以点击这里。

(三)、开始打包

进入打包镜像,当然啦,第一步还是要挂载共享文件夹,如此可以更方便的将你写的Python代码移动到虚拟机镜像中。挂载不会的点击这里。

在任意目录下创建一个项目打包文件夹,建议不要创建在系统自身的文件夹中(亲身试过,崩了QAQ)我是在/home/kivydev/下创建的PackFolder,同样,挂载文件也可以创建在这里。接下来,把通过共享文件夹分享过来的Python文件及kv文件复制进PackFolder。如图:

kivy虚拟机镜像,python

 打开终端,通过cd进入到PackFolder中,执行kdpp go(等同于buildozer android debug)进行打包(kdpp是一个API工具用于对buildozer指令的集成),通过该指令可以生成一个debug版本APP以及一个buildozer.spec文件,kdpp还有如下指令:

kdpp clean    # 清理打包环境,等同于buildozer android clean

kdpp release    # 执行打包命令,生成release版本APP等同于buildozer android release

kdpp go    # 执行打包命令,生成debug版本APP等同于buildozer android debug

debug版本与release版本的区别在于,debug会生成日志而release类似于发行版,虽然可以通过修改buildozer.spec文件来生成日志,后续会讲。

打包完成在Terminal会产生如图反馈:

kivy虚拟机镜像,python

通过kdpp生成了一个位于bin的apk文件,如图:

kivy虚拟机镜像,python

 然后就可以通过共享文件夹,将打包好的APK传送到Windows再传给手机就可以安装运行啦,效果如图:

kivy虚拟机镜像,python

(四)、buildozer.spec详解

通过kdpp go可以生成buildozer.spec文件,该文件是针对打包的一个集成声明文件,具体含义及其内容如下:

[app]

# (str) app应用名
title = My Application

# (str) 包名结尾
package.name = myapp

# (str) 包名开头,如果打包release apk必须把test改成其他任意字符串
package.domain = org.test

# (str) main.py所在目录,默认是spec所在目录
source.dir = .

# (list) 打包进apk的文件
source.include_exts = py,png,jpg,kv,atlas

# (list) 打包进apk的文件
#source.include_patterns = assets/*,images/*.png

# (list) 不打包进apk的文件
#source.exclude_exts = spec

# (list) 不打包进apk的目录,默认是tests和bin
#source.exclude_dirs = tests, bin

# (list) 不打包进apk的文件
#source.exclude_patterns = license,images/*/*.jpg

# (str) app版本
version = 0.1

# (str) Application versioning (method 2)
# version.regex = __version__ = ['"](.*)['"]
# version.filename = %(source.dir)s/main.py

# (list) 通称 requirements,打包第三方库时必须添加到这里
# comma separated e.g. requirements = sqlite3,kivy
requirements = python3,kivy

# (str) 第三方库源代码所在目录,如果指定了,打包时就会直接使用这个源代码,不会再去下载。
# Sets custom source for any requirements with recipes
# requirements.source.kivy = ../../kivy


# (list) Garden requirements,如果你用到kivy.graden的库就需要添加到这里
#garden_requirements =

# (str) app启动时的画面图片(闪屏)路径,默认是kivy图标
#presplash.filename = %(source.dir)s/data/presplash.png

# (str) app图标路径
#icon.filename = %(source.dir)s/data/icon.png

# (str) app显示方向,默认是竖屏 (one of landscape, sensorLandscape, portrait or all)
orientation = portrait

# (list) service服务列表
#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY

#
# OSX Specific
#

#
# author = © Copyright Info

# change the major version of python used by the app
osx.python_version = 3

# Kivy version to use
osx.kivy_version = 1.9.1

#
# Android specific
#

# (bool) app是否全屏,默认否
fullscreen = 0

# (string) 闪屏的背景色
# Supported formats are: #RRGGBB #AARRGGBB or one of the following names:
# red, blue, green, black, white, gray, cyan, magenta, yellow, lightgray,
# darkgray, grey, lightgrey, darkgrey, aqua, fuchsia, lime, maroon, navy,
# olive, purple, silver, teal.
#android.presplash_color = #FFFFFF

# (list) Permissions app权限配置
#android.permissions = INTERNET

# (int) Target Android API, 目标api level
android.api = 27

# (int) Minimum API ,app能支持的最低api level
android.minapi = 21

# (int) Android SDK 版本
#android.sdk = 27

# (str) Android NDK 版本
android.ndk = 19c

# (int) Android NDK API to use. This is the minimum API your app will support, it should usually match android.minapi.
android.ndk_api = 21

# (bool) Use --private data storage (True) or --dir public storage (False)
#android.private_storage = True

# (str) Android NDK 路径
android.ndk_path = /home/kivydev/andr/android-ndk-r19c

# (str) Android SDK 路径
android.sdk_path = /home/kivydev/andr/android-sdk-linux

# (str) ANT directory 路径
android.ant_path = /home/kivydev/andr/apache-ant-1.9.4

# (bool) 是否跳过Android sdk 升级,默认否
# android.skip_update = False

# (bool) 升级sdk过程中会询问同意接受sdk license,默认是提示你选择,改为True则是默认同意接受
# android.accept_sdk_license = False

# (str) app 入口类,一般不修改
#android.entrypoint = org.renpy.android.PythonActivity

# (str) app主题类型,一般不修改
# android.apptheme = "@android:style/Theme.NoTitleBar"

# (list) 白名单
#android.whitelist =

# (str) 白名单文件路径
#android.whitelist_src =

# (str) 黑名单文件路径
#android.blacklist_src =

# (list) 自定义jar添加到这里,供jnius调用,支持通配符
# OUYA-ODK/libs/*.jar
#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar

# (list) 自定义java文件添加到这里
#android.add_src =

# (list) aar文件添加到这里
#android.add_aars =

# (list) Gradle dependencies to add (currently works only with sdl2_gradle
# bootstrap)
#android.gradle_dependencies =

# (list) add java compile options
# this can for example be necessary when importing certain java libraries using the 'android.gradle_dependencies' option
# see https://developer.android.com/studio/write/java8-support for further information
# android.add_compile_options = "sourceCompatibility = 1.8", "targetCompatibility = 1.8"

# (list) Gradle repositories to add {can be necessary for some android.gradle_dependencies}
# please enclose in double quotes 
# e.g. android.gradle_repositories = "maven { url 'https://kotlin.bintray.com/ktor' }"
#android.add_gradle_repositories =

# (list) packaging options to add 
# see https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
# can be necessary to solve conflicts in gradle_dependencies
# please enclose in double quotes 
# e.g. android.add_packaging_options = "exclude 'META-INF/common.kotlin_module'", "exclude 'META-INF/*.kotlin_module'"
#android.add_gradle_repositories =

# (list) 增加java activity到manifest
#android.add_activites = com.example.ExampleActivity

# (str) OUYA Console category. Should be one of GAME or APP
# If you leave this blank, OUYA support will not be enabled
#android.ouya.category = GAME

# (str) Filename of OUYA Console icon. It must be a 732x412 png image.
#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png

# (str) XML file to include as an intent filters in <activity> tag
#android.manifest.intent_filters =

# (str) launchMode to set for the main activity
#android.manifest.launch_mode = standard

# (list) Android additional libraries to copy into libs/armeabi
#android.add_libs_armeabi = libs/android/*.so
#android.add_libs_armeabi_v7a = libs/android-v7/*.so
#android.add_libs_arm64_v8a = libs/android-v8/*.so
#android.add_libs_x86 = libs/android-x86/*.so
#android.add_libs_mips = libs/android-mips/*.so

# (bool) Indicate whether the screen should stay on
# Don't forget to add the WAKE_LOCK permission if you set this to True
#android.wakelock = False

# (list) Android application meta-data to set (key=value format)
#android.meta_data =

# (list) Android library project to add (will be added in the
# project.properties automatically.)
#android.library_references =

# (list) Android shared libraries which will be added to AndroidManifest.xml using <uses-library> tag
#android.uses_library =

# (str) Android logcat filters to use
#android.logcat_filters = *:S python:D

# (bool) Copy library instead of making a libpymodules.so
#android.copy_libs = 1

# (str) app架构,支持: armeabi-v7a, arm64-v8a, x86, x86_64
android.arch = armeabi-v7a

#
# Python for android (p4a) specific
#

# (str) python-for-android fork to use, defaults to upstream (kivy)
#p4a.fork = kivy

# (str) 使用的p4a分支
#p4a.branch = master

# (str) p4a源代码路径,默认从网络下载
#p4a.source_dir = 

# (str) recipes路径
#p4a.local_recipes =

# (str) Filename to the hook for p4a
#p4a.hook =

# (str) Bootstrap to use for android builds
# p4a.bootstrap = sdl2

# (int) port number to specify an explicit --port= p4a argument (eg for bootstrap flask)
#p4a.port =


#
# iOS specific
#

# (str) Path to a custom kivy-ios folder
#ios.kivy_ios_dir = ../kivy-ios
# Alternately, specify the URL and branch of a git checkout:
ios.kivy_ios_url = https://github.com/kivy/kivy-ios
ios.kivy_ios_branch = master

# Another platform dependency: ios-deploy
# Uncomment to use a custom checkout
#ios.ios_deploy_dir = ../ios_deploy
# Or specify URL and branch
ios.ios_deploy_url = https://github.com/phonegap/ios-deploy
ios.ios_deploy_branch = 1.7.0

# (str) Name of the certificate to use for signing the debug version
# Get a list of available identities: buildozer ios list_identities
#ios.codesign.debug = "iPhone Developer: <lastname> <firstname> (<hexstring>)"

# (str) Name of the certificate to use for signing the release version
#ios.codesign.release = %(ios.codesign.debug)s


[buildozer]

# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output))
log_level = 2

# (int) Display warning if buildozer is run as root (0 = False, 1 = True)
warn_on_root = 1

# (str) .buildozer文件路径
build_dir = /home/kivydev/test/.buildozer

# (str) Path to build output (i.e. .apk, .ipa) storage
# bin_dir = ./bin

#    -----------------------------------------------------------------------------
#    List as sections
#
#    You can define all the "list" as [section:key].
#    Each line will be considered as a option to the list.
#    Let's take [app] / source.exclude_patterns.
#    Instead of doing:
#
#[app]
#source.exclude_patterns = license,data/audio/*.wav,data/images/original/*
#
#    This can be translated into:
#
#[app:source.exclude_patterns]
#license
#data/audio/*.wav
#data/images/original/*
#


#    -----------------------------------------------------------------------------
#    Profiles
#
#    You can extend section / key with a profile
#    For example, you want to deploy a demo version of your application without
#    HD content. You could first change the title to add "(demo)" in the name
#    and extend the excluded directories to remove the HD content.
#
#[app@demo]
#title = My Application (demo)
#
#[app:source.exclude_patterns@demo]
#images/hd/*
#
#    Then, invoke the command line with the "demo" profile:
#
#buildozer --profile demo android debug

三、结语

上面就是关于Python运用Kivy开发基础APP以及打包的全过程,后面大部分的教程中提到的Kivy构建的代码打包也可以参考这个打包方法,后期可能会针对打包过程及软件运行过程产生的问题及解决方法进行整合。

温馨提示:建议不要随便乱动镜像中的任何配置,会崩,崩了我也不会修,听镜像作者说当初搭建这玩意废了老大的劲儿,所以不要修改已有配置。

感谢大家的阅读,祝大家心想事成,步步高升哈!文章来源地址https://www.toymoban.com/news/detail-693726.html

到了这里,关于Python移动APP开发之Kivy(二)——第一个APP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app 开发调试自动打开手机屏幕大小界面(Aidex移动端开发项目)

    上效果: 下载Aidex的移动端项目并打开: 若依-ruoyi-AiDex-Uniapp: 若依-Ruoyi APP 移动解决方案,基于uniapp+uView封装的一套基础模版,开箱即用,免费开源,一份代码多终端适配,支持H5、支付宝小程序、微信小程序、APP,实现了与ruoyi-vue后台完美对接的移动解决方案,可直接开始

    2024年02月22日
    浏览(57)
  • 基于android studio开发的火车票购票系统app,android移动开发课设,毕业设计

    基于android studio开发实现火车票购票系统app 适用于android移动开发学习项目,课程设计,毕业设计等 开发工具:android studio 或者intellij idea专业版 操作系统:windows10 java: JDK11 构建工具Gradle : gradle-7.0.0 模拟器AVD:pixel 3XL API 30 具体AVD配置详情如下 APP功能 该APP包含17个Activity,每

    2024年02月09日
    浏览(55)
  • 《移动软件开发》实验一:第一个微信小程序

    1、学习使用快速启动模板创建小程序的方法;2、学习不使用模板手动创建小程序的方法。 1.自动生成小程序 1.1 项目创建 ​ 双击微信开发者工具图标,使用管理员微信扫码二维码后进入菜单画面,选择菜单中的“小程序”选项进入小程序项目管理页面。依次填写项目名称(

    2024年02月10日
    浏览(44)
  • 手把手教你开发第一个HarmonyOS (鸿蒙)移动应用

    移动应⽤开发: Android IOS HarmonyOS (鸿蒙) 文档概览-HarmonyOS应用开发官网 2.1 系统的定义 2.1.1 系统的定位 HarmonyOS有三⼤特征: 搭载该操作系统的设备在系统层⾯融为⼀体、形成超级终端,让设备的硬件能⼒可以弹性 扩展,实现设备之间 硬件互助,资源共享。 对消费者⽽⾔,

    2024年02月02日
    浏览(80)
  • APP开发的未来:虚拟现实和增强现实的角色

    移动应用程序越来越多地在我们的日常生活中发挥着重要作用。但是,随着技术的不断发展,未来的 APP开发会有什么新的发展方向呢?这是每个人都在关心的问题。在过去的几年中,移动应用程序领域发生了巨大变化。像 VR/AR这样的技术为人们提供了更多有趣和创新的应用程

    2024年02月15日
    浏览(51)
  • 开发者出海|每周认识一个移动广告渠道之一 · Unity Ads

    广告是游戏厂商盈利的主要手段之一。随着各个公司开始准备2024的年度计划,为了帮助大家能在明年找准渠道,跟上行业与生态变化。光子易PhotonPay推出《应用出海|每周认识一个移动广告渠道》,将更深度的解读一些新兴渠道和垂直领域中的新面孔,帮助大家把握优质渠道

    2024年02月21日
    浏览(39)
  • 《移动软件开发》实验1:第一个微信小程序 实验报告

    本实验报告所参考实验文档为:Docs (feishu.cn) 如想获得详细的制作过程,请点击上面链接。该博客仅为个人使用实验报告 姓名和学号? / 本实验属于哪门课程? 中国海洋大学22夏《移动软件开发》 实验名称? 实验1:第一个微信小程序 博客地址? / Github仓库地址? / (备注:

    2024年02月10日
    浏览(39)
  • 【移动开发学习】 Android Studio 编写一个简单的微信界面

    Android Studio简单还原微信ui 目标 实现3-4个tab的切换效果 技术需求 activity, xml, fragment, recyclerview 成果展示 其中联系人界面通过recyclerview实现了可以滑动列表           仓库地址 https://github.com/SmileEX/wecaht.git 实现过程 主要ui 第一步我们首先把微信的ui主体做出来,即这三个部分

    2024年02月08日
    浏览(65)
  • 【移动开发学习】 Android Studio 编写一个简单的微信界面 (2)

    Android Studio简单还原微信ui 上一期完成内容(前情提要) 上次我们简单地实现了微信的几个初始界面,并且在联系人页面通过recycleview添加了许多的view 目标 建立在上次的基础上,我们来扩展联系人界面的功能,给每一个view添加一个点击功能,让其可以跳转到另一个activity,

    2024年02月05日
    浏览(63)
  • 如何开始开发一个跑腿App系统?

    开始开发之前,需明确系统所需的基本功能,包括用户注册、登录、下单、配送员匹配、订单跟踪等。这些功能需要在系统设计之初明确。 选择适合的技术栈。前端可以使用框架如React、Vue.js,后端可选择Node.js、Python等。数据库方面可选用MySQL、MongoDB等。 针对用户注册、登

    2024年02月06日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包