Kivy,一个上天入地的 Python 库

news2024/11/18 23:39:00

大家好!我是炒青椒不放辣,关注我,收看每期的编程干货。

一个简单的库,也许能够开启我们的智慧之门,
一个普通的方法,也许能在危急时刻挽救我们于水深火热,
一个新颖的思维方式,也许能激发我们无尽的创造力,
一个独特的技巧,也许能成为我们的隐形盾牌……


神奇的 Python 库之旅,第 16

目录

    • 一、初识 Kivy
    • 二、Kivy 基本操作
    • 三、布局机制
    • 四、Kivy 组件
    • 五、Kivy 的高级功能
    • 六、实战案例
    • 七、结语
    • 八、作者Info

一、初识 Kivy

什么是 Kivy?
Kivy 是一个开源的 Python 库,用于快速开发跨平台应用。它支持多点触控,适用于桌面、移动设备、平板电脑等多种平台。Kivy 提供了丰富的 UI 组件和灵活的布局机制,让你能够轻松地构建出界面美观、功能强大的应用程序。

为什么选择 Kivy?

  • 跨平台支持:Kivy 支持 Windows、macOS、Linux、Android 和 iOS 等多个平台,编写一次代码即可在多个平台上运行。
  • 多点触控:Kivy 支持多点触控操作,适用于触屏设备,让你的应用更加生动。
  • 丰富的组件:Kivy 提供了丰富的 UI 组件,如按钮、标签、文本框、滑块等,方便你快速构建应用界面。
  • 强大的布局机制:Kivy 提供了多种布局机制,如盒布局、栅格布局、锚定布局等,让你的界面布局更加灵活。

安装 Kivy
安装 Kivy 非常简单,只需要几行命令:

pip install kivy


Github 项目地址:

https://github.com/kivy/kivy

二、Kivy 基本操作

创建一个简单的 Kivy 应用
让我们从一个简单的 Hello World 应用开始,体验 Kivy 的基本操作。

from kivy.app import App
from kivy.uix.label import Label

class MyApp(App):
    def build(self):
        return Label(text='Hello, Kivy!')

if __name__ == '__main__':
    MyApp().run()

运行这段代码,你会看到一个窗口,里面显示着“Hello, Kivy!”的字样。是不是很简单?

使用按钮
接下来,让我们添加一个按钮,当你点击它时会显示一条消息。

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

class MyApp(App):
    def build(self):
        button = Button(text='Click me!')
        button.bind(on_press=self.on_button_press)
        return button

    def on_button_press(self, instance):
        instance.text = 'You clicked me!'

if __name__ == '__main__':
    MyApp().run()

这段代码创建了一个按钮,当你点击它时,按钮的文字会变成“You clicked me!”。

三、布局机制

盒布局(BoxLayout)
Kivy 提供了多种布局机制,其中盒布局(BoxLayout)是最常用的一种。它可以让你垂直或水平排列组件。

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

class MyApp(App):
    def build(self):
        layout = BoxLayout(orientation='vertical')
        layout.add_widget(Button(text='Button 1'))
        layout.add_widget(Button(text='Button 2'))
        layout.add_widget(Button(text='Button 3'))
        return layout

if __name__ == '__main__':
    MyApp().run()

栅格布局(GridLayout)
栅格布局(GridLayout)允许你按照网格排列组件。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button

class MyApp(App):
    def build(self):
        layout = GridLayout(cols=2)
        layout.add_widget(Button(text='Button 1'))
        layout.add_widget(Button(text='Button 2'))
        layout.add_widget(Button(text='Button 3'))
        layout.add_widget(Button(text='Button 4'))
        return layout

if __name__ == '__main__':
    MyApp().run()

锚定布局(AnchorLayout)
锚定布局(AnchorLayout)让你能够将组件锚定在布局的特定位置。

from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.button import Button

class MyApp(App):
    def build(self):
        layout = AnchorLayout(anchor_x='center', anchor_y='center')
        layout.add_widget(Button(text='Centered Button'))
        return layout

if __name__ == '__main__':
    MyApp().run()

四、Kivy 组件

标签(Label)
标签是用来显示文本的组件。

from kivy.app import App
from kivy.uix.label import Label

class MyApp(App):
    def build(self):
        return Label(text='Hello, Kivy!')

if __name__ == '__main__':
    MyApp().run()

按钮(Button)
按钮是一个可点击的组件。

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

class MyApp(App):
    def build(self):
        button = Button(text='Click me!')
        button.bind(on_press=self.on_button_press)
        return button

    def on_button_press(self, instance):
        instance.text = 'You clicked me!'

if __name__ == '__main__':
    MyApp().run()

文本输入(TextInput)
文本输入框允许用户输入文本。

from kivy.app import App
from kivy.uix.textinput import TextInput

class MyApp(App):
    def build(self):
        return TextInput()

if __name__ == '__main__':
    MyApp().run()

滑块(Slider)
滑块是一个允许用户选择数值范围的组件。

from kivy.app import App
from kivy.uix.slider import Slider

class MyApp(App):
    def build(self):
        return Slider(min=0, max=100, value=25)

if __name__ == '__main__':
    MyApp().run()

五、Kivy 的高级功能

画布(Canvas)
Kivy 的画布(Canvas)允许你绘制图形和图像。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse, Line

class MyWidget(Widget):
    def __init__(self, **kwargs):
        super(MyWidget, self).__init__(**kwargs)
        with self.canvas:
            Color(1, 0, 0, 1)
            self.ellipse = Ellipse(pos=(100, 100), size=(200, 200))
            self.line = Line(points=[300, 300, 500, 500], width=2)

class MyApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()

手势识别
Kivy 支持多点触控和手势识别。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label

class MyWidget(Widget):
    def on_touch_down(self, touch):
        self.add_widget(Label(text='Touched!', pos=touch.pos))

class MyApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()

六、实战案例

简单的计算器
让我们用 Kivy 实现一个简单的计算器。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput

class CalculatorApp(App):
    def build(self):
        self.operators = ["+", "-", "*", "/"]
        self.last_was_operator = None
        self.result = TextInput(multiline=False, readonly=True, halign="right", font_size=32)
        
        layout = GridLayout(cols=4)
        layout.add_widget(self.result)
        
        buttons = [
            "7", "8", "9", "/",
            "4", "5", "6", "*",
            "1", "2", "3", "-",
            ".", "0", "C", "+"
        ]
        
        for button in buttons:
            layout.add_widget(Button(text=button, on_press=self.on_button_press))
        
        layout.add_widget(Button(text="=", on_press=self.on_result))
        
        return layout

    def on_button_press(self, instance):
        current = self.result.text
        button_text = instance.text
        
        if button_text == "C":
            self.result.text = ""
        elif button_text in self.operators:
            if current and (self.last_was_operator is False):
                self.result.text += button_text
                self.last_was_operator = True
        else:
            self.result.text += button_text
            self.last_was_operator = False

    def on_result(self, instance):
        try:
            self.result.text = str(eval(self.result.text))
        except Exception:
            self.result.text = "Error"

if __name__ == "__main__":
    CalculatorApp().run()

记事本应用
我们来实现一个简单的记事本应用,用户可以创建、保存和读取笔记。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
import os

class NoteApp(App):
    def build(self):
        self.notes_dir = "notes"
        if not os.path.exists(self.notes_dir):
            os.makedirs(self.notes_dir)

        layout = BoxLayout(orientation="vertical")
        self.note_text = TextInput(hint_text="Write your note here...")
        layout.add_widget(self.note_text)

        buttons_layout = BoxLayout(size_hint_y=None, height=50)
        buttons_layout.add_widget(Button(text="Save", on_press=self.save_note))
        buttons_layout.add_widget(Button(text="Load", on_press=self.load_note))
        layout.add_widget(buttons_layout)

        return layout

    def save_note(self, instance):
        note = self.note_text.text
        if note:
            note_path = os.path.join(self.notes_dir, "note.txt")
            with open(note_path, "w") as f:
                f.write(note)
            self.note_text.text = ""

    def load_note(self, instance):
        note_path = os.path.join(self.notes_dir, "note.txt")
        if os.path.exists(note_path):
            with open(note_path, "r") as f:
                self.note_text.text = f.read()

if __name__ == "__main__":
    NoteApp().run()


更多功能、详细用法可参考官方文档:

https://kivy.org/doc/stable

七、结语

今天我和各位靓仔们一起探索了 Kivy 这个强大的 Python 库。从基本操作到布局机制,再到丰富的组件和高级功能,最后通过实际案例展示了 Kivy 的强大和灵活性。

希望你能将这些知识应用到实际项目中,开发出自己心仪的应用。Kivy 不仅能让你的编程旅程更加有趣,还能帮你实现更多创意和梦想。

在这里插入图片描述

八、作者Info

Author:炒青椒不放辣

Goal:让编程更有趣! 专注于 Web 开发、爬虫,游戏开发,数据分析、自然语言处理,AI 等,期待你的关注,让我们一起成长、一起 Coding!

版权说明:本文禁止抄袭、转载,侵权必究!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2162128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

USB 电缆中的信号线 DP、DM 的缩写由来

经常在一些芯片的规格书中看到 USB 的信号对是以 DP 和 DM 命名: 我在想,这些规格书是不是写错了,把 N 写成 M 了?DM 中的 M 到底是什么的缩写? 于是我找了一些资料,终于在《Universal Serial Bus Cables …

string 的介绍及使用

一.string类介绍 C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理&a…

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开,发现是一段PT2242 信号 PT2242信号 有长有短,短的为0,长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

ssm病人跟踪治疗信息管理系统

专业团队,咨询就送开题报告,欢迎大家咨询留言 摘 要 病人跟踪治疗信息管理系统采用B/S模式,促进了病人跟踪治疗信息管理系统的安全、快捷、高效的发展。传统的管理模式还处于手工处理阶段,管理效率极低,随着病人的不断…

《SG-Former: Self-guided Transformer with Evolving Token Reallocation》ICCV2023

摘要 SG-Former(Self-guided Transformer)是一种新型的视觉Transformer模型,旨在解决传统Transformer在处理大型特征图时面临的计算成本高的问题。该模型通过一种自适应细粒度的全局自注意力机制,实现了有效的计算成本降低。它利…

VmWare安装虚拟机教程(centos7)

VMWare下载: 下载 VMware Workstation Pro - VMware Customer Connect 安装包:(16的版本)免费!(一个赞就行) 一直点下一步即可,注意修改一下安装位置就好 二、安装虚拟机 安装虚…

鸭脖变“刺客”,啃不起了

撰文|ANGELICA 编辑|ANGELICA 审核|烨 Lydia 声明|图片来源网络。日晞研究所原创文章,如需转载请留言申请开白。 你有多久没吃卤味了? 2020年之后,人们对于几大卤味巨头的关注度正在下降。 …

视频字幕生成:分享6款专业易操作的工具,让创作更简单!

​视频字幕如何添加?日常剪辑Vlog视频时,就需要给视频添加上字幕了。字幕是一个比较重要的元素,它不仅可以帮助听力受损或语言障碍的人士理解内容,还可以让你的视频更加易于理解和吸引观众。 那么如何实现视频字幕生成&#xff0c…

【LLaMa2入门】从零开始训练LLaMa2

目录 1 背景2 搭建环境2.1 硬件配置2.2 搭建虚拟环境2.2.1 创建虚拟环境2.2.2 安装所需的库 3 准备工作3.1 下载GitHub代码3.2 下载模型3.3 数据处理3.3.1 下载数据3.3.2 数据集tokenize预处理 4 训练4.1 修改配置4.2 开始训练4.3 多机多卡训练 5 模型推理5.1 编译5.1.1 安装gc…

ResNet18模型扑克牌图片预测

加入会员社群,免费获取本项目数据集和代码:点击进入>> 1. 项目简介 该项目旨在通过深度学习技术,使用ResNet18模型对扑克牌图像进行预测与分类。扑克牌图片分类任务属于图像识别中的一个应用场景,要求模型能够准确识别扑克…

【python篇】python pickle模块一篇就能明白,快速理解

持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象。通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识。另外,还会让您更深一步地了解Python 的对象…

音视频入门基础:FLV专题(5)——FFmpeg源码中,判断某文件是否为FLV文件的实现

一、引言 通过FFmpeg命令: ./ffmpeg -i XXX.flv 可以判断出某个文件是否为FLV文件: 所以FFmpeg是怎样判断出某个文件是否为FLV文件呢?它内部其实是通过flv_probe函数来判断的。从《FFmpeg源码:av_probe_input_format3函数和AVI…

Serilog文档翻译系列(五) - 编写日志事件

日志事件通过 Log 静态类或 ILogger 接口上的方法写入接收器。下面的示例将使用 Log 以便语法简洁,但下面显示的方法同样可用于接口。 Log.Warning("Disk quota {Quota} MB exceeded by {User}", quota, user); 通过此日志方法创建的警告事件将具有两个相…

mes系统在中小企业智能制造作用

MES系统(制造执行系统)在中小企业智能制造中扮演着至关重要的角色,其作用主要体现在以下几个方面: 1. 提升生产效率与质量 实时监控与数据采集:MES系统能够实时采集生产现场的各项数据,如设备状态、生产进…

nmap 命令:网络扫描

一、命令简介 ​nmap​(Network Mapper)是一个开放源代码的网络探测和安全审核的工具。它最初由Fyodor Vaskovich开发,用于快速地扫描大型网络,尽管它同样适用于单个主机。 ​nmap​的功能包括: 发现主机上的开放端…

电信、移动、联调等运营商都有那些国产化自研软件

国产化自研软件方面有着积极的探索和实践,包括操作系统、数据库和中间件等,电信运营商在国产化软件方面取得了显著进展: 操作系统: 中国电信推出了基于华为欧拉openEuler开源系统的天翼云操作系统CTyunOS,已上线部署5万…

【2024W38】肖恩技术周刊(第 16 期):白嫖AI的最佳时段

周刊内容: 对一周内阅读的资讯或技术内容精品(个人向)进行总结,分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率,每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

asp.net core日志与异常处理小结

asp.net core的webApplicationBuilder中自带了一个日志组件,无需手动注册服务就能直接在控制器中构造注入,本文主要介绍了net core日志与异常处理小结,需要的朋友可以参考下 ILogger简单使用 asp.net core的webApplicationBuilder中自带了一个日志组件…

Elasticsearch可视化工具ElasticHD

目录 介绍 ElasticHD应用程序页面 安装 基本用法 独立可执行文件 ES版本支持 SQL特性支持: 超越SQL功能支持: SQL的用法 Docker快速入门: 下载地址 介绍 ElasticHD是ElasticSearch可视化管理工具。它不需要任何软件。它在您的Web浏览器中工作,允许您随时随地管理…

unshare -p时提示Cannot allocate memory如何解决

当使用unshare -p命令时,出现如下报错: unshare -p /bin/bash bash: fork: Cannot allocate memory 如果想要正常使用,只需要添加–fork选项就行 unshare -p --fork /bin/bash 在使用 unshare -p 创建新的 PID 命名空间时,存在一…