{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Kivy指南-前言\n", "\n", "> Kivy是一个图形用户界面(graphical user interface,GUI)工具用来轻松创建跨平台的Python应用,[Kivy Blueprints(2015)](https://www.amazon.com/Kivy-Blueprints-Mark-Vasilkov/dp/1783987847),个人认为是最好的kivy入门教程\n", "\n", "- toc: true \n", "- badges: true\n", "- comments: true\n", "- categories: [jupyter,Kivy,Android,iOS]\n", "- image: kbpic/0.2.hellokivy.png" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 前言" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "移动应用开发几年前就是热点了,现在是个软件用户就想要移动版。桌面操作系统也受到影响,跨平台的软件成为新常态。甚至通常局限于微软桌面操作系统的游戏开发者也开始找一些Mac和Linux平台上的工作了(比如Steam,目前有Mac游戏近4000个,SteamOS+Linux游戏2000多个)。\n", "\n", "这对新手和个人开发者是大利好:跨平台的支持可以增加用户,销售量自然会更好。\n", "\n", "但是,写可移植的软件是非常耗费资源的过程,对小公司和个人开发者的影响比大公司更甚。\n", "\n", "尤其是许多平台都有不同语言的SDK:iOS用Objective-C和Swift,Android用Java,MS用.Net,更多是C#来开发软件。\n", "\n", "使用这些工具可以通过系统功能来制作相应的原生应用,但是跨平台的代码重用变得十分困难。就算你精通所有语言和相关的操作,代码的移植仍然是一件复杂的事情。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 一次编写,到处运行" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "因此,统一多平台支持开发工具呼之欲出。无独有偶,1995年的Sun公司就为解决类似问题发明了Java。其口号为“Write once, run anywhere”(一次编写,到处运行,WORA),虽然Java已经20年了,很多人都在各种纪念。但是其啰嗦的代码仍然没能实现当年的豪言壮语,一些程序员的改编版本更能表达人们的感受——“write once, run away”(一次编写,到处跑偏),有一些放弃Java转向了更好的程序语言,比如Python。\n", "\n", "本书主题Kivy是一个图形用户界面(graphical user interface,GUI)工具用来轻松创建跨平台的Python应用。其主要特征如下:\n", "\n", "- **兼容性**:Kivy支持多平台,包括Windows,MacOS,Linux,Android和iOS,均出自一个工具\n", "- **原生界面**:Kivy填补了不同输入方式间的缝隙,允许你用相同的代码处理不同的输入方式,包括鼠标和触摸屏\n", "- **快速图形硬件加速**:OpenGL渲染让Kivy可以胜任图形需求高的应用,如视频游戏,还可以通过平滑变换改善用户体验\n", "- **使用Python开发**:Kivy的app是用Python写的,轻松简单,可移植性良好,Python的标准库和[PyPI](https://pypi.python.org/pypi)第三方丰富模块都可以使用\n", "\n", "Kivy可以看作许多模块的超集:许多知名的模块如Pygame,SDL,GStreamer都是Kivy的组成部分。但是,Kivy的API更加高级、统一,方便使用。\n", "\n", "Kivy是开源的,其源代码在[GitHub上](https://github.com/kivy/kivy)。你可以fork一下,帮忙打补丁,也可以增加新特性。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 本书内容简介" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "本书分9章。\n", "\n", "- [*第1章,时钟app*](https://asyncfor.com/jupyter/kivy/android/ios/2019/02/01/kivy-ch1-clock-app.html)对Kivy应用开发做简要介绍。包括Kivy语言、布局、部件和计时器。本章会做一个时钟app,与手机上的时钟应用类似\n", "- [*第2章,画图app*](https://asyncfor.com/jupyter/kivy/android/ios/2019/03/01/kivy-ch2-paint-app.html)对Kivy框架的部件和功能进一步挖掘。通过制作画图app学习自定义部件,在画布上画任意形状,处理多点触控事件等\n", "- [*第3章,Android录音app*](https://asyncfor.com/jupyter/kivy/android/ios/2019/04/01/kivy-ch3-sound-recorder-for-android.html)是用Kivy开发一个Android应用。通过Pyjnius模块实现Python与Java的交互,调用Android的API来实现Kivy用户界面\n", "- [*第4章,聊天app*](https://asyncfor.com/jupyter/kivy/android/ios/2019/05/01/kivy-ch4-chat-app.html)介绍Kivy的网络应用开发,用Python写一个简单通信协议,利用Twisted框架建立服务器-客户端模型,实现一个Kivy聊天app\n", "- [*第5章,远程桌面app*](https://asyncfor.com/jupyter/kivy/android/ios/2019/06/01/kivy-ch5-remote-desktop-app.html)用另一种方式写服务器-客户端应用。这章通过HTTP协议来构建模型。首先建立命令行模式的HTTP服务器,然后再用Kivy实现远程桌面app\n", "- [*第6章,2048 app*](https://asyncfor.com/jupyter/kivy/android/ios/2019/07/01/kivy-ch6-2048-app.html)是实现一个2048游戏。我们将演示Kivy更复杂的功能,用Kivy属性实现数据绑定和触摸手势处理来创建自定义部件\n", "- [*第7章,飞翔的小鸟app*](https://asyncfor.com/jupyter/kivy/android/ios/2019/08/01/kivy-ch7-flappy-bird-app.html)是另一个Kivy游戏,实现著名的Flappy Bird游戏。我们会学习纹理坐标的使用,声音效果和碰撞检测等知识\n", "- [*第8章,着色器app*](https://asyncfor.com/jupyter/kivy/android/ios/2019/09/01/kivy-ch8-shaders-app.html)介绍Kivy应用中如何GLSL着色器。这一章首先介绍OpenGL原始类型的概念,如索引和顶点,然后写出可以直接在GPU上运行代码,最后实现一个满天星屏保app\n", "- [*第9章,射击app*](https://asyncfor.com/jupyter/kivy/android/ios/2019/10/01/kivy-ch9-shmup-app.html)延续上一章的内容,用GLSL着色器做游戏。首先实现一个可重用的粒子系统,然后通过粒子系统构建游戏角色。前面介绍过的许多内容在这个游戏中都会得到体现,如碰撞检测,触摸屏控制,声音效果等" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 环境设置" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "下面简要介绍Kivy的安装方法,包括Mac,Linux和Windows系统。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Kivy同时支持Python2和Python3,2020年Python2停止维护,建议使用Python3。\n", "\n", ">许多平台不需要单独安装Python:比如Mac OS上自带Python2,Windows上和Kivy打包在一起,Linux(尤其是Ubuntu)支持`apt-get`安装。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 安装并运行Kivy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Kviy的最新稳定版本可以在[官方网站](http://kivy.org/)找到。如下图所示:\n", "\n", "![kivydownload](kbpic/0.1.kivydownload.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "下载安装包后,具体平台安装方法可以看图中第三列指令,简要介绍如下:\n", "\n", "\n", "- Mac:\n", " 1. 打开命令行窗口\n", " 2. 执行`kivy`\n", " 3. Python提示符出现后输入`import kivy`\n", " 4. 如果安装顺利会出现`[INFO] Kivy v1.9.0`\n", " \n", " \n", "- Linux:\n", " 1. 打开命令行窗口\n", " 2. 执行`python`\n", " 3. Python提示符出现后输入`import kivy`\n", " 4. 如果安装顺利会出现`[INFO] Kivy v1.9.0`\n", " \n", " \n", "- Windows:\n", " 1. 双击**kivy.bat**文件\n", " 2. 执行`python`\n", " 3. Python提示符出现后输入`import kivy`\n", " 4. 如果安装顺利会出现`[INFO] Kivy v1.9.0` \n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "运行Kivy应用很简单:\n", "\n", "- Mac上用`kivy main.py`\n", "- Linux上用`python main.py`\n", "- Windows上用`kivy.bat main.py`(或者把**main.py**拖到**kivy.bat**上运行)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hello, Kivy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "下面我们演示一个Kivy app的`hello world`版。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 代码" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "程序的入口是`main.py`,代码如下:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from kivy.app import App\n", "\n", "\n", "class HelloApp(App):\n", " pass\n", "\n", "\n", "if __name__ == \"__main__\":\n", " HelloApp().run()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 布局" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "布局文件是应用类名的去掉`App`的小写部分加`.kv`,也就是`hello.kv`,代码如下所示:\n", "\n", "```yaml\n", "Label:\n", " text: 'Hello, Kivy'\n", "```\n", "\n", "这里只用了一个Kivy标签部件`Label`,属性是`text`。布局文件用一种简洁、声明式的语言定义复杂的布局,后面会介绍。\n", "\n", "运行程序,看到的界面如下所示:\n", "\n", "![kivydownload](kbpic/0.2.hellokivy.png)\n", "\n", "下面就让我们开始Kivy之旅吧!Enjoy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> Tip: 最新源代码请参考作者[Mark Vasilkov](https://github.com/mvasilkov/kb)的github" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "238px" }, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }