Kivy 教程 – 使用 Python 构建桌面 GUI 应用程序

2023-10-24

Kivy 是一个开源 Python 库;您可以使用它在 Windows、Linux、macOS、Android 和 iOS 上创建应用程序。

我们将讨论如何使用 Kivy 按钮、标签、回收视图、滚动视图、Kivy Canvas 和其他小部件来熟悉该库。

您可以使用称为 Kv 语言的中间语言来设计 Kivy 小部件,稍后您将看到。

现在,让我们开始安装。

 

 

安装

如果您的计算机上安装了多个版本的 Python,那么您必须安装您希望用于开发的版本的 Kivy。

假设要安装 Python,请考虑以下步骤:

  1. Python 包可以使用 pip 安装。由于Kivy在使用pip安装时需要编译,因此我们需要wheels,它是已编译包的预构建发行版。您还可以使用 git 来安装 Kivy,但在本教程中,我们将使用 Wheel。

运行以下命令来安装 pip 和wheel:


python -m pip install --upgrade pip wheel setuptools  
  1. 现在我们必须安装依赖项。执行以下命令:

python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew  

Then:


python -m pip install kivy.deps.gstreamer  
  1. 安装 Kivy 的依赖项后,使用以下命令安装 Kivy:

python –m pip install kivy  

 

Kivy GUI

在本节中,您将学习如何创建和运行 Kivy 程序以及如何在 Kivy 中构建基本界面。

让我们创建一个扩展名为 .py 的文件。

要创建 Kivy 界面,我们首先需要使用以下语句在程序中导入 Kivy 应用模块:


from kivy.app import App  

现在从 kivy.uix.label 导入标签:


from kivy.uix.label import Label  

现在是编写我们的主程序的时候了。


class FirstKivy(App):
    def build(self):
        return Label(text="Hello Kivy!")
  

在上面的代码片段中,一个类继承自App类。然后要构建应用程序,我们必须在 build() 函数上返回一个小部件。在上面的代码中,我们返回了一个带有文本“Hello Kivy”的标签。

最后一步是调用这个函数。您可以创建该类的对象,也可以只编写以下语句:


FirstKivy().run()  

整个 python 文件如下所示:


from kivy.app import App
from kivy.uix.label import Label
class FirstKivy(App):
    def build(self):
        return Label(text="Hello Kivy!")
FirstKivy().run()  

这段代码的结果将是这样的:

恭喜!您的第一个 Kivy 应用程序成功运行。

 

基维纽扣

在本节中,您将学习如何创建按钮、更改按钮的颜色、启用/禁用、如何在按钮上添加图像以及如何更改其大小和位置。

在上一个程序中,我们使用了标签。要创建按钮,请导入按钮而不是标签,如下所示:


from kivy.app import App
from kivy.uix.button import Button
class FirstKivy(App):   
    def build(self):       
        return Button(text="Welcome to LikeGeeks!")    
FirstKivy().run()  

整个输出屏幕如下:

该按钮会填充整个窗口,不用担心,我们稍后会调整它的大小。

更改 Kivy 按钮的颜色

Kivy 按钮的默认颜色是灰色。您可以通过指定来更改颜色背景颜色格式为 (r, g, b, a) 的属性。代码演示如下:


from kivy.app import App
from kivy.uix.button import Button
class KivyButton(App):
    def build(self):
        return Button(text="Welcome to LikeGeeks!", background_color=(155,0,51,53))
KivyButton().run()  

当您运行该程序时,它将显示如下按钮:

禁用 Kivy 按钮

要禁用按钮,您必须将disabled 属性设置为True。


mybtn.disabled = True  

考虑以下代码以在按下按钮后禁用该按钮:


from kivy.uix.button import Button
from kivy.app import App
from functools import partial
class KivyButton(App):
    def disable(self, instance, *args):
        instance.disabled = True
    def update(self, instance, *args):
        instance.text = "I am Disabled!"
    def build(self):
        mybtn = Button(text="Click me to disable")
        mybtn.bind(on_press=partial(self.disable, mybtn))
        mybtn.bind(on_press=partial(self.update, mybtn))
        return mybtn
KivyButton().run()  

在上面的代码中,我们导入了partial函数从功能工具这样我们就可以使用bind()功能。

A KivyButton()类是使用两个自定义方法创建的。第一种方法是禁用()方法。您可以将其命名为您想要的名称。

然后我们就有了update()单击按钮后更新按钮文本的方法。另外,您可以根据需要命名您的函数。

下一个函数是build()功能。创建按钮时此方法会自动运行。然后我们调用了禁用()方法使用partial。同样,update()禁用按钮后调用方法来更新按钮的文本。

返回值来自禁用()函数绑定到on_press我们按钮的功能。因此,当按下按钮时,首先将其禁用,然后更新文本。

输出是这样的:

更改大小和位置

使用按钮小部件的 pos 和 size_hint 属性,您可以轻松地分别更改按钮的位置和大小。您可以像这样更改 Kivy 按钮的大小和位置:


from kivy.app import App
from kivy.uix.button import Button
class KivyButton(App):
    def build(self):
        return Button(text="Welcome to LikeGeeks!", pos=(300,350), size_hint = (.25, .18))
KivyButton().run()  

下面的输出将是这样的:

The pos参数指定按钮的位置,而尺寸提示参数指定按钮的大小。

Kivy 按钮中的图像

在本节中,您将学习向按钮添加图像。我们将第一次使用 Kv 语言来创建我们的小部件,而不是从代码中实例化它们。

下面是我们要导入的 Kivy 库:


from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder  

BoxLayout 用于定位小部件,以便可以将小部件以有组织的方式放置在一起。在Kivy中,可以使用多种布局来组织小部件,例如框布局、锚布局、浮动布局等。

加载Kv字符串或文件

默认情况下,Kivy 会尝试加载与您的类同名的 Kv 文件,但不包含 App 一词且小写。

如果你的班级是TestApp,因此它将搜索名为的 Kv 文件test.kv在同一目录中加载小部件。

另一种使用 Kivy Builder 加载 kv 文件的方法。

Kivy Builder 用于从 Kv 字符串或文件加载小部件。例如,如果你想创建一个小部件,你可以像这样使用构建器:


Builder.load_string(""" """)  

在三引号内,添加所需的小部件及其属性。在下面的示例中,我们添加了一个 KivyButton 类。

首先,设置按钮的文本和大小,然后在源属性和图像坐标中指定图像。

图像放置在同一目录中,因此图像路径现在没问题了。


Builder.load_string("""
<KivyButton>:
    Button:
        text: "Hello Button!"
        size_hint: .12, .12
        Image:
            source: 'images.jpg'
            center_x: self.parent.center_x
            center_y: self.parent.center_y
""")
  

现在,让我们导入这个定义并运行我们的类:


from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
Builder.load_string("""
<KivyButton>:
    Button:
        text: "Hello Button!"
        size_hint: .12, .12
        Image:
            source: 'images.jpg'
            center_x: self.parent.center_x
            center_y: self.parent.center_y   
""")

class KivyButton(App, BoxLayout):
    def build(self):  
        return self
KivyButton().run()  

同样,您可以使用以下命令从单独的文件加载 Kv 字符串加载文件像这样的方法:


Builder.load_file("myfile.kv")  

这里的文件包含所有 Kivy 小部件定义。

 

基维标签

在我们的第一个 GUI 应用程序中,我们向表单添加了一个标签,但这一次,我们将使用标签属性。

您可以使用标签将文本添加到我们的 GUI。 Kivy 标签仅支持 ASCII 和 Unicode 字符串。

 

更改字体大小

您可以使用 font_size 属性更改标签的字体大小:


from kivy.app import App
from kivy.uix.button import Label
class KivyButton(App):
    def build(self):
        return Label(text="Hello Label", font_size='30')
KivyButton().run()  

为标签中的文本添加样式

在本节中,我们将更改标签中文本的样式。

例如,使用标记进行粗体、斜体、更改颜色、下划线等。考虑以下陈述:


Label(text='[u][color=ff0066][b]Better days[/b][/color] are coming; They are called [i][color=ff9933]Saturday[/i] and [i]Sunday[/color][/i][/u]', markup = True)  

哪里的


[color][/color]  

用于给字体着色。


from kivy.app import App
from kivy.uix.button import Label
class KivyLabel(App):
    def build(self):
        return Label(text='[u][color=ff0066][b]Welcome[/b][/color] To [i][color=ff9933]Like[/i]Geeks[/color][/u]', markup = True)
KivyLabel().run()  

这个结果会是这样的:

 

Kivy 回收视图

假设您有大量要在屏幕上显示的小部件,这可能会影响性能。

RecycleView 的目标是在屏幕上排列视图组。

RecycleView 的内存效率很高,因为它根据屏幕的大小将内容加载到内存中,这与 ListView 不同,ListView 中的所有项目都加载到内存中。

RecyclerView 的关键特性之一是它支持动画。 RecyclerView可以创建交互式且高效的可滚动列表。

在开始编码之前,有两个主要概念需要关注:

  1. 视图持有人它具有视野并有助于回收。
  2. 适配器用于调整数据以在列表中显示。

要使用RecycleView,我们需要从recycleview模块导入RecycleView,如下所示:


from kivy.uix.recycleview import RecycleView  

在下面的示例中,我们将创建一个垂直的按钮列表。因此,我们要放置的视图项是按钮:

第一步是定义我们的recycleview的布局和视图类:


Builder.load_string('''
<ExampleRV>:
    viewclass: 'Button'
    RecycleBoxLayout:
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'
''')
  

现在我们必须定义我们的recycleview类:


class ExampleRV(RecycleView):
    def __init__(self, **kwargs):
        super(ExampleRV, self).__init__(**kwargs)
        self.data = [{'text': str(x)} for x in range(20)]
  

Here


__init__  

带有 **kwargs 的类的构造函数意味着任意数量的参数或关键字参数都是可接受的。现在调用上面的类:


class RecycleApp(App):
    def build(self):
        return ExampleRV()
RecycleApp().run()
  

所以完整的代码会是这样的:


from kivy.app import App
from kivy.uix.recycleview import RecycleView
from kivy.lang import Builder
Builder.load_string('''
<ExampleRV>:
    viewclass: 'Button'   
    RecycleBoxLayout:   
        size_hint_y: None        
        height: self.minimum_height        
        orientation: 'vertical'        
''')

class ExampleRV(RecycleView):
    def __init__(self, **kwargs):
        super(ExampleRV, self).__init__(**kwargs)
        self.data = [{'text': str(x)} for x in range(20)]
class RecycleApp(App):
    def build(self):
        return ExampleRV()
RecycleApp().run()  

输出如下所示:

 

Kivy滚动视图

Kivy中的ScrollView提供了一个可滚动的视图。使用scrollview,我们可以在屏幕上滚动x轴和y轴。

首先,我们将导入一个名为 runTouchApp() 的新函数。这个函数将使我们的滚动视图支持触摸。


from kivy.base import runTouchApp  

我们将定义scrollView如下:


from kivy.base import runTouchApp
from kivy.lang import Builder
root = Builder.load_string(r'''
ScrollView:
    Label:   
        text: 'Scrollview Example' * 100       
        font_size: 30        
        size_hint_x: 1.0        
        size_hint_y: None        
        text_size: self.width, None        
        height: self.texture_size[1]        
''')

runTouchApp(root)  

输出将是这样的:

 

Kivy 明文输入

在本节中,我们将创建一个文本字段和一个用于清除文本字段内容的按钮。

对于文本字段,导入 textinput 模块:


from kivy.uix.textinput import TextInput  

让我们创建一个 BoxLayout 来将我们的小部件添加到我们的类中。


self.box = BoxLayout(orientation='horizontal', spacing=20, pos=(0,550))  

现在我们要创建一个输入字段:


self.txt = TextInput(hint_text="Write here",size_hint=(.5,.1))  

在输入字段之后,我们必须创建一个清除文本的按钮。

为此,我们将创建一个明文将文本设置为空字符串的方法,当按下按钮时,即使用按钮的 on_press 属性,我们将调用此方法。

因此,当我们按下按钮时,文本就会被删除。


self.btn = Button(text='Clear All', on_press=self.clearText,size_hint=(.1,.1))  

现在我们必须将小部件(输入字段和按钮)添加到框布局中:


self.box.add_widget(self.txt)
self.box.add_widget(self.btn)  

The 明文方法如下所示:


def clearText(self, instance):
        self.txt.text = ''  

整个代码将是这样的:


from kivy.app import App
from kivy.uix.button import  Button
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout
class ClearApp(App):
    def build(self):
        self.box = BoxLayout(orientation='horizontal', spacing=20)
        self.txt = TextInput(hint_text='Write here', size_hint=(.5,.1))
        self.btn = Button(text='Clear All', on_press=self.clearText, size_hint=(.1,.1))
        self.box.add_widget(self.txt)
        self.box.add_widget(self.btn)
        return self.box
    def clearText(self, instance):
        self.txt.text = ''
ClearApp().run()  

输出将是这样的:

 

基维时钟

您可以使用 Kivy 时钟对象来安排特定时间间隔后的函数调用。

在本节中,我们将创建一个按钮。作为使用 Kivy 时钟的示例,我们将每 2 秒更改一次按钮的文本。

首先导入以下模块:


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

现在,创建一个类并初始化一个计数器变量,如下所示:


class ClockExample(App):
    i = 0  

现在,创建一个按钮并使用 Clock.schedule_interval 我们将每 2 秒调用一个用户定义的函数。每次调用该函数时,计数器变量的值都会增加 1,该值打印在按钮上。


    def build(self):
       self.mybtn = Button(text='Number of Calls')
       Clock.schedule_interval(self.Clock_Callback, 2)
       return self.mybtn
    def Clock_Callback(self, dt):
        self.i = self.i+1
        self.mybtn.text = "Call = %d"%self.i  

The dt参数用于表示调度和调用回调函数之间经过的时间。如果没有传递任何参数,它将抛出一个有关回调函数的错误,该函数需要一个位置参数,但给出了两个。

完整的代码如下所示:


from kivy.app import App
from kivy.uix.button import  Button
from kivy.clock import Clock
class ClockExample(App):
    i=0
    def build(self):
        self.mybtn = Button(text='Number of Calls')
        Clock.schedule_interval(self.clock_callback, 2)
        return self.mybtn
    def clock_callback(self, dt):
        self.i+= 1
        self.mybtn.text = "Call = %d" % self.i
ClockExample().run()  

每 2 秒,按钮文本就会按预期更改。

 

基维帆布

您可以在画布中绘制您想要的内容。在本节中,您将学习创建画布以及如何在画布上绘制矩形。

我们将在 boxlayout 中创建一个画布,然后在画布上创建一个矩形。

导入以下模块:


import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout  

考虑下面的代码来创建画布:


kvWidget = """
MyWidget:
    orientation: 'vertical'
    canvas:
        Color:
            rgb: (255, 0, 0)
        Rectangle:
            size: self.size
            pos: self.pos
"""
class MyWidget(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)  

在此代码中,我们有一个名为 MyWidget 的 BoxLayout 类。现在,kvWidget 字符串定义了一个具有 color 属性的画布以及一个与 BoxLayout 具有相同大小和位置的矩形。

完整的代码将是这样的:


from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
kvWidget = """
MyWidget:
    orientation: 'vertical'   
    canvas:    
        Color:        
            rgb: (255, 128, 0)           
        Rectangle:        
            size: self.size            
            pos: self.pos
"""
class MyWidget(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
class CanvasApp(App):
    def build(self):
        return Builder.load_string(kvWidget)
CanvasApp().run()  

输出将是这样的:

 

画布图像

要将图像添加到画布,我们将创建一个与画布大小相同的矩形,然后在矩形上添加图像。

kvWidget 字符串将如下所示:


from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
kvWidget = """
MyWidget:
    orientation: 'vertical'   
    canvas:   
        Rectangle:        
            size: self.size            
            pos: self.pos            
            source: 'images.jpg'            
"""
class MyWidget(BoxLayout):
    def __init__(self, **kwargs):       
        super().__init__(**kwargs)
class CanvasApp(App):
    def build(self):        
        return Builder.load_string(kvWidget)
CanvasApp().run()  

 

Kivy 与 PyQt

与 Kivy 一样,我们也使用 PyQt 来创建 GUI 应用程序,但 PyQt 在开发桌面应用程序中更受欢迎。

尽管我们在这里讨论了 Kivy 来构建桌面应用程序,但由于 Kivy 小部件的多点触控功能,Kivy 通常用于移动应用程序。

PyQt 库可用于其他编程语言(例如 C++),而 Kivy 仅可用于 Python。

Kivy使用OpenGL接口直接在屏幕上绘制小部件,因此您也可以创建具有良好图形效果的游戏。

 

我希望您找到合适的 Python GUI 框架来构建您需要的东西。

最后,我们讨论了 Kivy 和之前的 Tkinter、PyQt5 的许多示例。在构建图形界面时您更喜欢哪一种?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kivy 教程 – 使用 Python 构建桌面 GUI 应用程序 的相关文章

随机推荐

  • 如何在 Ubuntu 16.04、14.04 上安装 Nginx、PHP 7 和 MySQL

    PHP 7 2 的最新主要版本已经发布 在速度和安全性方面进行了大量优化 所以你应该尝试这个版本来进行开发 本教程将帮助您在 Ubuntu 17 10 16 04 和 14 04 LTS 版本上安装 Nginx PHP 7 2 和 MySQ
  • 了解 Terraform 语法和配置文件

    Terraform 由 HashiCorp 开发 是一款因其在基础设施即代码 IaC 方面的强大功能而广为人知的工具 本综合指南旨在让您深入了解 Terraform 语法 特别关注配置文件 了解 Terraform 语法 Terraform
  • Fedora 26 发布,新功能及升级步骤

    Fedora 26 发布 最终的 Fedora 26 已发布于2017 年 7 月 11 日 Fedora 26有各种软件升级 安全补丁 该版本将与 GENOME 3 24 一起发布 您可以从以下位置下载 Fedora 26 预发行版 Be
  • 如何重命名 SQL Server 数据库

    Microsoft SQL Server 为您提供了多种重命名数据库的方法 您可以使用 SQL Server Management Studio 或运行 SQL 查询来重命名数据库 在重命名数据库之前 请记住 它可能会中断使用当前数据库名称
  • 如何使用SCP命令安全传输文件

    SCP 安全复制 是一个命令行实用程序 允许您在两个位置之间安全地复制文件和目录 With scp 您可以复制文件或目录 从本地系统到远程系统 从远程系统到本地系统 在本地系统的两个远程系统之间 当传输数据时scp 文件和密码都经过加密 因
  • 如何在 CentOS 7 上安装 VMware Workstation Player

    VMware是一个成熟稳定的虚拟化解决方案 允许您在一台机器上运行多个独立的操作系统 您可以创建自己的虚拟机并评估许多软件供应商作为虚拟设备分发的软件 这些软件可从VMware 解决方案交流 本教程将指导您完成在 CentOS 7 上安装
  • 如何在 Ubuntu 18.04 上安装 Java

    Java 是世界上最流行的编程语言之一 用于构建不同类型的跨平台应用程序 本教程介绍如何在 Ubuntu 18 04 上安装各种版本的 OpenJDK 以及 Oracle Java 相同的说明适用于 Ubuntu 16 04 和任何基于 U
  • 如何在 Ubuntu 18.04 上安装 Apache Cassandra

    Apache Cassandra 是一个免费的开源 NoSQL 数据库 不存在单点故障 它提供线性可扩展性和高可用性 而不会影响性能 Apache Cassandra 被许多组织使用 包括 Apple NetFlix eBay 和 Easo
  • Linux 中的超时命令

    timeout是一个命令行实用程序 它运行指定的命令 并在给定时间段后终止该命令 如果该命令仍在运行 换句话说 timeout允许您运行有时间限制的命令 这timeout命令是 GNU 核心实用程序包的一部分 几乎所有 Linux 发行版上
  • 如何在 CentOS 7 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 在大多数情况下 当在虚拟机上运行 CentOS 时 不存在交换
  • 如何在 Ubuntu 18.04 上设置 Apache 虚拟主机

    在本教程中 我们将提供有关如何在 Ubuntu 18 04 上设置 Apache 虚拟主机的分步说明 Apache 虚拟主机允许您在一台计算机上运行多个网站 使用虚拟主机 您可以指定站点文档根目录 包含网站文件的目录 为每个站点创建单独的安
  • 如何在 Ubuntu 20.04 上安装和配置 VNC

    虚拟网络计算 VNC 是一种图形桌面共享系统 允许您使用键盘和鼠标远程控制另一台计算机 它是 Microsoft 的开源替代品远程桌面协议 RDP 本文介绍如何在 Ubuntu 20 04 上安装和配置 VNC 服务器 我们还将向您展示如何
  • 如何在 Ubuntu 18.04 上禁用防火墙

    Ubuntu 附带了一个名为 UFW 简单防火墙 的防火墙配置工具 UFW 是一个用户友好的前端 用于管理 iptables 防火墙规则 其主要目标是使管理防火墙规则更容易 或者顾名思义 不复杂 强烈建议保持防火墙启用 但是 在某些情况下
  • 如何在 Debian 9 上安装 Jenkins

    Jenkins是一个开源自动化服务器 提供了一种设置持续集成和持续交付 CI CD 管道的简单方法 持续集成 CI 是一种 DevOps 实践 团队成员定期将代码更改提交到版本控制存储库 然后运行自动化构建和测试 持续交付 CD 是自动构建
  • 如何在 Debian 10 上配置 MySQL (MariaDB) 主从复制

    MySQL 复制是将数据从一台数据库服务器 主服务器 复制到一台或多台服务器 从服务器 的过程 MySQL 支持多种复制拓扑 其中主 从拓扑是最著名的拓扑之一 其中一台数据库服务器充当主服务器 而一台或多台服务器充当从服务器 默认情况下 复
  • 如何在 Ubuntu 18.04 上安装 Ghost

    Ghost 是一个构建在 Node js 平台之上的现代源代码发布平台 它完全可定制且易于使用 使您可以以几乎零的学习曲线发布内容 在本教程中 我们将向您展示如何使用 Nginx 作为代理 免费的 Let s Encrypt SSL 证书
  • 使用 NumPy 范数计算向量和矩阵范数

    在线性代数中 范数是为向量空间中的每个向量分配严格正的长度或大小的函数 它是矢量大小的度量 从数学上来说 对于一个向量x the p 范数定义为 x p sum xi p 1 p 在本教程中 我们将使用numpy linalg norm f
  • 在 Pandas query() 中使用字符串方法:数据帧过滤

    The Pandas 中的 query 方法允许您过滤数据帧 并且当与字符串方法结合使用时 可能性变得广泛 在本教程中 您将学习如何在query 功能来细化和过滤数据 目录 hide 1 检查子字符串 str contains 2 str
  • Seaborn histplot(用直方图可视化数据)

    Seaborn 是最广为人知的数据可视化库之一 运行在Matplotlib 通过 Seaborn 我们可以渲染各种类型的绘图 并提供简单 直观且高度可定制的 API 来生成数据可视化 如果没有丰富的可视化 就很难理解数据并与数据进行交流 想
  • Kivy 教程 – 使用 Python 构建桌面 GUI 应用程序

    Kivy 是一个开源 Python 库 您可以使用它在 Windows Linux macOS Android 和 iOS 上创建应用程序 我们将讨论如何使用 Kivy 按钮 标签 回收视图 滚动视图 Kivy Canvas 和其他小部件来