Kivy crash 中文教程 实例入门 1. 第1个应用 Kivy App (Making a simple App)

本文介绍如何使用Kivy创建一个简单的应用程序,包括创建空白窗口、添加控件和实现多点触控等功能。通过逐步演示,读者可以了解到Kivy的基本用法及其在移动应用开发中的优势。
部署运行你感兴趣的模型镜像

1.  空白窗口

在 PyCharm 中创建一个名为 TutorialApp 的项目,然后在该项目中新建了个名为 tutorial_app.py 的 Python 源文件,在 PyCharm 的代码编辑器中,输入下面的代码:

from kivy.app import App
 
class TutorialApp(App):
    pass
 
if __name__ == "__main__":
    TutorialApp().run()

虽然只有寥寥数行代码,但这已经是一个可以运行的 Kivy 应用了!

运行这段代码,将显示出一个黑色的窗口。虽然简单,但已经是一个标准的窗口了。你可以移动窗口、改变窗口大小、最大化、最小化,以及关闭窗口。

第 1 行 from kivy.app import App 导入 kivy 的 App 类,它是所有 kivy 应用的基类。

我们继承 App 类,派生出TutorialApp 类(第 3, 4 行)。我们还没有给 TutorialApp 添加任何方法,但它从 App 类中继承了 kivy 应用最基本的方法,如创建窗口、设置窗口的大小和位置等。

最后,要让 kivy 应用真正跑起来,我们需要创建 TutorialApp 对象,并调用它的 run 方法(第 7 行)。

2. 添加控件 (widget)

一个光秃秃的窗口是没啥用的,我们还得在窗口上放置一些控件(widget)。Kivy 内置了丰富的控件,如按钮 (button), 复选框 (checkbox), 标签 (label), 输入框 (textinput), 滚动容器 (scrollable container) 等。

这里咱们不妨先试试比较简单的按钮控件 (button)。

from kivy.app import App
from kivy.uix.button import Button
 
class TutorialApp(App):
    def build(self):
        return Button()
 
if __name__ == "__main__":
    TutorialApp().run()

运行修改后的程序,乍看上去,似乎是窗口的背景从黑色变成了灰色。实际上是整个窗口被一个巨大的按钮填满了,不信你用鼠标点击试试?看到背景颜色变化了吗?这表明,你点击的是一个巨大的按钮,而不是窗口本身。

第 2 行 from kivy.uix.button import Button 导入 kivy 的按钮控件 Button。

第 5, 6 行,我们实现了 TutorialApp 类的 build 方法(继承自 App 类)。build 方法返回一个按钮 (Button) 对象。build 方法返回的控件,在 Kivy 中,称之为“根控件” (root widget)。Kivy 将自动缩放根控件,让它填满整个窗口。这就是为什么我们会得到一个充满整个窗口的巨型按钮。

我们还可以在创建按钮时传递参数,让它变得更生动一些。

from kivy.app import App
from kivy.uix.button import Button
 
class TutorialApp(App):
    def build(self):
        return Button(text='iPaoMi', background_color=(0, 0, 1, 1), font_size=150)
 
if __name__ == "__main__":
    TutorialApp().run()

例如,我们可以将按钮的背景色设置为蓝色,并在按钮上以 150 的字号,显示文字 iPaoMi (第 6 行)。其中,参数 background_color 接受的 4 元组,分别表示 RGBA 颜色的 4 个分量。

3. 多点触控

现在,我们的应用还非常地简单,几乎没有什么交互。而且,其他许多 GUI 库,例如 QT, GTK 等也可以很容易地做出类似的效果,实在看不出 Kivy 究竟有何过人之处。接下来,咪博士将向大家展示如何快速实现多点触控的操作,你将看到为什么我们说 Kivy 是为移动应用而生。

这一节中,我们将会用到 2 个 Kivy 控件:Scatter 和 Label。

  • Scatter 是实现多点触控的关键,它可以方便地实现移动、缩放,以及旋转的操作
  • Label 是用来显示文字的,我们将它放在 Scatter 上,从而实现对文字的移动、缩放和旋转的操作

最终,我们修改后的代码如下:

from kivy.app import App
from kivy.uix.scatter import Scatter
from kivy.uix.label import Label
 
class TutorialApp(App):
    def build(self):
        s = Scatter()
        l = Label(text='iPaoMi', font_size=150)
        s.add_widget(l)
        return s
 
if __name__ == "__main__":
    TutorialApp().run()

运行程序,我们看到窗口左下角显示了一些字符串。

我们可以用鼠标左键把左下角的字符串拖动到窗口中央。

我们可以用鼠标右键来模拟手机屏幕上多点触控的操作。用鼠标右键在字符串上点击,会显示一个红色的小圆点,表示一个触控点的位置。我们在字符串的 2 个不同位置,用鼠标右键点击,形成 2 个触控点。然后,尝试用鼠标左键去拖动字符串,你会发现字符串发生了旋转和缩放!

最后,让咪博士为大家讲解一下代码吧。

第 2, 3, 4 行分别导入 Scatter 和 Label 控件

第 7, 8 行分别创建了 Scatter 和 Label 控件实例

第 9 行 s.add_widget(l)  将 Label 控件实例添加到 Scatter 控件实例中。这样用户的操作直接影响 Scatter 控件,再由 Scatter 自动将这些影响作用到它内部的子控件(即 Label 控件)上。

第 10 行 return s 将 Scatter 实例作为根控件返回。Kivy 会自动用根控件(Scatter 实例)填充整个窗口。

Kivy 的设计中充分考虑了移动应用的交互,这是 Kivy 与其他 GUI 库 (如 QT, GTK)  最重要的区别。当然,用鼠标来模拟多点触控的操作显得很不自然。后面的教程中,咪博士将教大家,如何将 Kivy 应用打包并运行在手机上。届时,大家将真正见识到 Kivy 在移动应用开发中的威力。

原文链接: http://www.ipaomi.com/2017/11/23/kivy-crash-中文教程-实例入门-1-第1个应用-kivy-app-making-a-simple-app/




您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

你提出的问题非常典型:**为什么一个简单的 Kivy 程序可以运行,但稍微复杂一点就闪退?** 你提到: > 你运行这个程序没问题: ```python from kivy.app import App from kivy.uix.button import Button class MyApp(App): def build(self): return Button(text='Hello Kivy!') if __name__ == '__main__': MyApp().run() ``` 但如果你在 `return Button(...)` 中多加一些组件,比如多个 `Button` 或者使用 `BoxLayout` 等布局管理器,就会**闪退**。 --- ## 🔍 问题原因分析 闪退(Crash)在 Kivy 的 Android 应用中通常是由以下几种原因导致的: --- ### 1. **Python 异常未被捕获(导致应用崩溃)** 在桌面端(如 Windows、Linux),Python 会打印错误信息;但在 Android 上,**异常不会显示在屏幕上,而是直接导致应用退出**。 > ✅ 所以你看到的是“闪退”,其实是你的程序抛出了异常,但你没看到错误信息。 --- ### 2. **KivyLauncher 不支持某些模块或功能** KivyLauncher 是一个轻量级运行器,它使用的 Python 环境是精简的。某些模块(如 `kivy.uix.popup`, `kivy.uix.filechooser`, `kivy.graphics` 等)**可能不被完全支持或需要额外配置**。 --- ### 3. **Android 系统限制(如内存、渲染)** - 如果你创建了太多组件或使用了复杂的布局,可能导致内存不足或渲染失败。 - 特别是如果你使用了自定义绘图(如 `Canvas`),在 Android 上可能不兼容。 --- ### 4. **代码中存在语法或逻辑错误** 你可能在扩展代码时,不小心引入了语法错误或逻辑错误,比如: - 忘记导入某个模块 - 组件嵌套错误 - 布局未正确设置 - 没有正确返回 `Widget` --- ## ✅ 解决方案与调试方法 ### ✅ 方法一:使用 Pydroid3 查看错误日志(推荐) Pydroid3 是目前 Android 上最强大的 Python 开发环境之一,它会**显示详细的错误信息**。 #### 示例:添加多个按钮导致闪退的代码 你可能写了类似这样的代码: ```python from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout class MyApp(App): def build(self): layout = BoxLayout(orientation='vertical') layout.add_widget(Button(text='Btn1')) layout.add_widget(Button(text='Btn2')) # 可能导致闪退 return layout MyApp().run() ``` 如果这个代码在 KivyLauncher 中闪退,但在 Pydroid3 中运行,你会看到错误信息,比如: ``` ImportError: No module named 'kivy.uix.boxlayout' ``` 或者: ``` TypeError: Cannot add non-widget as child `` --- ### ✅ 方法二:使用 Buildozer 构建 APK 并查看日志 使用 Buildozer 构建 APK 后,你可以通过 `adb logcat` 查看详细的崩溃日志。 #### 示例命令: ```bash buildozer -v android debug deploy run logcat ``` 你可以在日志中搜索 `python` 或 `kivy` 关键词,找到具体错误。 --- ### ✅ 方法三:确保你导入了所有用到的模块 如果你使用了 `BoxLayout`、`Label`、`TextInput` 等组件,**必须显式导入它们**: ```python from kivy.uix.button import Button from kivy.uix.label import Label from kivy.uix.boxlayout import BoxLayout ``` --- ### ✅ 方法四:确保你返回的是一个 `Widget` 子类 Kivy App 的 `build()` 方法必须返回一个 `Widget`,否则会崩溃: ```python def build(self): return "Not a widget" # ❌ 错误! ``` 必须返回一个组件: ```python def build(self): return BoxLayout() # ✅ 正确 ``` --- ## ✅ 示例:一个可以在 KivyLauncher 上运行的完整布局 ```python from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout class MyApp(App): def build(self): layout = BoxLayout(orientation='vertical') layout.add_widget(Button(text='Hello')) layout.add_widget(Button(text='World')) return layout MyApp().run() ``` 确保你使用的 KivyLauncher 支持这些组件。如果不支持,建议使用 Pydroid3 或 Buildozer。 --- ## ✅ 总结:你应该检查的 5 个关键点 | 检查项 | 是否满足 | |--------|----------| | 是否导入了所有用到的组件? | ✅ | | build() 是否返回了一个 Widget? | ✅ | | 是否使用了不支持的模块? | ✅ | | 是否使用 Pydroid3 或 Buildozer 查看错误信息? | ✅ | | 是否在 Android 上测试前先在桌面端运行? | ✅ | ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咪博士

又脱发了!请咪博士喝杯奶茶吧!

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

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

打赏作者

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

抵扣说明:

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

余额充值