编程学习网 > 编程语言 > Python > 快速上手Python GUI库Kivy教程
2023
12-12

快速上手Python GUI库Kivy教程

kivy 是一个开源跨平台的 Python UI 框架,就可以快速开发 PC、移动端的 GUI 。基于 Python,采用 Python 和 CPython,界面代码和业务逻辑代码相互分离。

安装 Kivy
在使用像 Kivy 这样的第三方库之前,我们必须在我们的工作环境中安装它。安装 Kivy 就像python -m pip install kivy在终端或命令行上运行命令一样快。此命令将从Python 包索引 (PyPI)安装库。
但是,在使用第三方库时,最好创建一个 Python虚拟环境,这是针对特定 Python 版本的自包含 Python 安装,可用于隔离给定项目的依赖项。
要创建虚拟环境,您通常会使用标准库中的Pythonvenv模块。启动命令行窗口并在您的工作目录中键入以下命令。
$ python -m venv kivy_env
此命令将创建一个名为的文件夹,kivy_env其中包含一个 Python 虚拟环境。python --version此环境中的 Python 版本与您在命令行上运行时获得的版本相同。
接下来,我们需要激活虚拟环境。使用适当的命令,具体取决于您使用的是 Windows、macOS 还是 Linux:C:/> .\kivy_env\Scripts\activate
一旦确认可以正常工作,您就可以通过运行以下命令在刚刚创建的虚拟环境中安装 Kivy:(kivy_env) $ python -m pip install kivy
使用此命令,您将在活动的 Python 虚拟环境中安装 Kivy,现在就可以开始了。
用 Python 编写你的第一个 Kivy GUI 应用程序

事不宜迟,让我们开始使用 Kivy 和 Python 创建我们的第一个应用程序。对于这个应用程序,我们将使用一个Label对象在我们的屏幕上显示传统"Hello, World!"消息。要编写一个最小的 Kivy GUI 应用程序,我们需要运行几个步骤:
App子类化
实现它的build()方法,返回一个Widget实例
实例化此类并调用其run()方法
让我们从导入所需的类开始。对于我们的示例,我们只需要App和Label类。创建一个名为的 Python 文件app.py并添加以下导入:
from kivy.app import App
from kivy.uix.label import Label
该类App提供了使用 Kivy 创建 GUI 应用程序所需的基本功能,例如管理事件循环。同时,该类Label将作为我们 GUI 的根视觉元素或小部件。

接下来,我们可以创建我们的子类App。我们在这里调用它MainApp。但是,您可以随意称呼它:
from kivy.app import App
from kivy.uix.label import Label

class MainApp(App):
    def build(self):
        return Label(text="Hello, World!")
该子类使用了Python 中面向对象编程 (OOP) 中的继承概念。超类中定义的所有属性和方法都App自动由子类继承MainApp。

为了让我们的应用程序创建一个 UI,我们需要定义一个build()方法。在 中build(),我们创建并返回一个小部件或布局,这将是我们 UI 结构中的根对象。

该build()方法是将在屏幕上绘制的任何内容的入口点。在我们的示例中,它创建并返回一个带有文本的标签"Hello, World!"。

最后,我们需要创建一个实例MainApp并调用它的run()方法:

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

class MainApp(App):
    def build(self):
        return Label(text="Hello, World!")

MainApp().run()
在最后一行,我们创建了一个实例MainApp并调用了它的run()方法。此方法启动应用程序并运行其主循环。就是这样!我们准备运行我们的第一个 Kivy 应用程序。打开命令行并运行以下命令:
$ python app.py
您将在屏幕上看到以下窗口:

请注意,窗口的标题栏显示 title Main,它来自您的App子类的名称。
下一步是探索 Kivy 的其他一些基本特性,这些特性将允许您使用这个库编写功能齐全的 GUI 应用程序。

探索小部件和布局
在上一节中,我们多次提到了小部件和布局——您可能想知道它们是什么!小部件是显示信息或提供特定功能的 GUI 元素。它们允许您的用户与您应用程序的 GUI 进行交互。

另一方面,布局提供了一种将小部件排列成应用程序窗口中特定结构的方法。布局还可以为属于它的小部件提供某些行为,例如ScatterLayout,它允许对子小部件进行多点触控调整大小。

在 Kivy 中,您会在模块下的相应模块中找到小部件和布局类kivy.uix。例如,要导入Button类,我们可以使用:

from kivy.uix.button import Button
在 Kivy 中,小部件和布局类通常位于以类本身命名的模块中。但是,该类使用CamelCase,并且包含模块使用小写字母。

例如,采用以下导入:

# Widgets
from kivy.uix.label import Label
from kivy.uix.image import Image

# Layouts
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
您会发现此命名约定的一些例外情况。例如:
from kivy.uix.image import AsyncImage
from kivy.uix.screenmanager import FadeTransition
这通常发生在定义多个密切相关的类的模块中,例如Image和AsyncImage。

小部件
小部件是基于 Kivy 的 GUI 的构建块。Kivy 应用程序中一些最常用的 GUI 小部件包括:

Widget是创建小部件所需的基类。
Label用于在窗口和对话框上呈现文本。
TextInput为可编辑的纯文本提供一个框。
Button当用户按下它时触发动作。
CheckBox提供一个可以选中或取消选中的双态按钮。
Image用于在 GUI 上显示图像。
ProgressBar可视化一些任务的进度。
DropDown提供了一个多功能的下拉列表,可以列出不同的小部件。
使用这些小部件和 Kivy 提供的其他一些小部件,您可以为您的应用程序构建复杂且用户友好的界面。
布局
Kivy 也有一组丰富的布局类,允许你连贯地和功能性地安排你的小部件来构建 GUI。常见布局的一些示例包括:

BoxLayout以垂直或水平方式顺序排列小部件。
FloatLayout将小部件排列在包含窗口的特定位置。
RelativeLayout根据相对位置排列子部件。
GridLayout在由行和列定义的网格中排列小部件。
PageLayout以允许从一页翻转到另一页的方式创建多页布局。
ScatterLayout定位其子部件类似于 a RelativeLayout。
StackLayout以从左到右然后从上到下的顺序堆叠,或者从上到下然后从左到右的顺序堆叠。
您可以将布局组合和嵌套在一起以构建复杂的用户界面。
使用小部件和布局:一个实际示例
作为如何在 Kivy 中使用小部件和布局的示例,让我们看一个常用的布局类:GridLayout. 使用此类,我们可以创建行和列的网格。网格的每个单元格都有一对唯一的从零开始的坐标。考虑以下示例:

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

ROWS = COLS = 3

class GridApp(App):
    def build(self):
        root = GridLayout(rows=ROWS, cols=COLS)
        for i in range(ROWS):
            for j in range(COLS):
                root.add_widget(Button(text=f"({i}, {j})"))
        return root

GridApp().run()


在该build()方法中,我们实例化了GridLayout三行三列。然后使用for循环将按钮小部件添加到使用该add_widget()方法的布局中。

当我们运行这个应用程序时,我们会看到如下所示的窗口:

网格上的每个按钮显示其对应的一对坐标。第一个坐标代表行,第二个坐标代表列。与其他布局类一样,GridLayout可以采用多个参数来微调其行为。

在 Kivy 中绘制形状:canvas属性
要深度定制 GUI 或设计 2D 视频游戏,我们可能需要绘制 2D 形状,例如矩形、圆形、椭圆形或三角形。在 Kivy 中这样做很简单。该库提供了一组丰富的形状类,您可以在kivy.graphics包中找到它们。其中一些课程包括:
Ellipse
Line
Rectangle
Triangle
要使用 Kivy 在屏幕上绘制形状,我们需要使用对象canvas的属性Widget。此属性包含该类的一个实例Canvas,它位于kivy.graphics包中。
让我们以屏幕上绘制的白色方块为例,看看它是如何工作的:

from kivy.app import App
from kivy.core.window import Window
from kivy.graphics import Rectangle
from kivy.uix.widget import Widget
class CanvasApp(App):
    def build(self):
        root = Widget()
        size = 200
        width, height = Window.size
        pos_x = 1/2 * (width - size)
        pos_y = 1/2 * (height - size)
        with root.canvas:
            Rectangle(size=[size, size], pos=[pos_x, pos_y])
        return root

CanvasApp().run()
在里面build(),我们创建了root小部件并定义了size我们的形状。它将是一个正方形,因此每一边都是相等的。
接下来,我们计算坐标以使我们的形状在窗口上居中。创建形状时传递的坐标用于窗口的左上角。
为了计算正确的值,我们采用主窗口的width和height,将这些值减半以获得中心。然后我们减去形状宽度或高度的一半,将形状的中心定位在窗口的中间。这可以简化为1/2 * (width - size)或1/2 * (height - size)。我们将生成的左上角坐标存储在pos_x和中pos_y。

接下来,我们使用canvas根窗口的属性来绘制形状。此属性支持该with声明,该声明为创建我们的形状提供了适当的上下文。在with块内,我们Rectangle使用size和pos参数定义我们的实例。

最后,我们root按预期返回小部件。最后一行代码创建应用程序实例并调用其run()方法。如果您从命令行运行此应用程序,那么您将在屏幕上看到以下窗口:


您已经在 Kivy 应用程序中绘制了一个正方形。计算出的坐标将正方形放置在窗口的中心。默认颜色为白色。然而,我们可以改变它:

# ...
from kivy.graphics import Color, Rectangle
from kivy.uix.widget import Widget
# ...

class CanvasApp(App):
    def build(self):
        # ...
        with root.canvas:
            Color(1, 1, 0, 1)
            Rectangle(size=[side, side], pos=[pos_x, pos_y])
 # ...
Color在此代码片段中,我们为包中的类添加了一个导入graphics。该类Color接受四个数字参数,0它们1代表我们目标颜色的红色、绿色、蓝色和透明度分量,它们代表我们的目标颜色。

例如,值(1, 0, 0, 1)表示完全红色和完全不透明的颜色。该值(0, 1, 0, 0.5)是完全绿色、一半不透明和一半透明。因此,该值(1, 1, 0, 1)给出完全不透明的黄色。因此,如果您运行该应用程序,您将获得以下输出:

我们可以尝试不同的颜色值和不同的形状类别,这很酷。
Color()最后请注意,要在绘制的矩形上看到效果,Color必须在类之前实例化该类Rectangle。您可以将此视为在使用画笔在画布上绘画之前先将画笔蘸在调色板上!Color有趣的是,只要没有应用不同的颜色,实例之后的任何绘图都会相应地绘制。
使用该with语句非常方便并且有助于处理形状。或者,我们可以使用以下canvas.add()方法:

root.canvas.add(Color(1, 1, 0, 1))
root.canvas.add(
    Rectangle(size=[side, side], pos=[pos_x, pos_y])
)
这些语句等同于我们在with块中的语句。来吧,自己尝试一下。

使用 Kivy 语言设计你的 GUI
Kivy 还提供了一种称为 Kv 语言的声明性语言,旨在分离应用程序的 GUI 设计和业务逻辑。在本教程中,我们不会深入使用 Kv 语言。但是,我们将重点介绍它的一些主要特性和优势。
使用 Kv 语言,您可以声明和设置 GUI 应用程序的小部件和图形组件的样式。您将把您的 Kv 代码放在.kv扩展名为 . 然后您可以将这些文件的内容加载到您的应用程序中以构建 GUI。您至少有两种方法来加载文件的内容.kv:
依靠自动加载机制
使用Builder类进行手动加载
在接下来的部分中,您将学习这两种使用 Kv 语言构建 Kivy 应用程序 GUI 的方法的基础知识。

依靠自动加载小部件
如前所述,Kv 语言可帮助您将业务逻辑与 GUI 设计分开。让我们用我们应用程序的更新版本来说明这种可能性"Hello, World!":

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

class CustomLabel(Label):
    pass

class MainApp(App):
    def build(self):
        root = CustomLabel()
        return root

MainApp().run()


如您所见,我们已经对该Label类进行子类化以创建一个新类CustomLabel,但未对子类进行任何修改,因此它的功能与该类完全相同,Label但名称不同。我们添加一个pass语句,它是一个 Python占位符语句,它使代码在语法上有效。

main.kv接下来,创建一个与您的应用程序文件一起调用的文件。使用以下代码定义标签:

<CustomLabel>:
    text: "Hello, World!"

请注意,您的标签必须与应用程序文件中的自定义 Python 类同名。此外,该.kv文件必须与您的子类同名App,但没有App后缀且为小写。在此示例中,您的子类名为MainApp,因此您的.kv文件必须为main.kv.
现在您可以从命令行运行该应用程序。您将在屏幕上看到以下窗口:


Kv 语言,也称为 kivy 语言或简称 kvlang,允许我们以声明的方式创建小部件树。它还允许您将小部件属性彼此绑定或绑定到回调。

通过类加载小Builder部件
当你的 Kivy 项目增长时,你的.kv文件也会增长。因此,建议您将文件拆分成不同的文件以提高可读性。在这种情况下,您最终会得到多个.kv文件,而自动加载机制是不够的。您必须使用Builder来自kivy.lang.Builder.

为了探索如何使用Builder,让我们在BoxLayout. 标签将在labels.kv文件中提供,而按钮将存在于buttons.kv文件中。

这是此应用程序的 Python 代码:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label

Builder.load_file("labels.kv")
Builder.load_file("buttons.kv")

class CustomLabel(Label):
    pass

class CustomButton(Button):
    pass

class MainApp(App):
    def build(self):
        root = BoxLayout(orientation="vertical")
        root.add_widget(CustomLabel())
        root.add_widget(CustomButton())
        return root

MainApp().run()


导入所需的类后,我们调用该load_file()方法。此方法将文件的文件名.kv作为参数并将其加载到您的应用程序中。

接下来,您将按照上一节中使用的模式创建自定义标签和按钮。在 中build(),您创建一个BoxLayout并将两个小部件添加到其中。现在您需要提供所需的.kv文件。

继续并创建一个labels.kv包含以下内容的文件:

<CustomLabel>:
    text: "This is a custom label!"
    font_size: 50
    bold: True
该文件提供了带有文本的标签"This is a custom label!"。它的字体大小为50像素,并且是粗体。
将buttons.kv具有以下代码:
<CustomButton>:
    text: "Click me!"

您的自定义按钮将非常小。它只会有文字"Click me!"。继续并从命令行运行该应用程序。您将在屏幕上看到以下窗口:


除了使用load_file()构建 Kv 语言文件,你还可以在你的 Python 文件中直接在多行字符串中解析和加载 Kv 语言:

Builder.load_string("""
<CustomLabel>:
    text: "This is a custom label!"
    font_size: 50
    bold: True
""")
Builder.load_string("""
<CustomButton>:
    text: "Click me!"
""")


这些对的调用load_string()完全等同于我们原始代码示例中的相应调用load_file()。

我们来看最后一个使用 Kv 语言的例子。这次我们将使用语言来绘制形状。创建一个rectangle.py包含以下内容的文件:

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

class CustomRectangle(Widget):
    pass

class MainApp(App):
    def build(self):
        return CustomRectangle()

MainApp().run()


现在继续在同一目录中创建另一个文件并将其另存为main.kv. 然后添加以下内容:

<CustomRectangle>:
  canvas:
    Color:
      rgba: 1, 1, 0, 1
    Rectangle:
      size: 200, 200
      pos: 0, 0


如果您运行该rectangle.py文件,那么您将在窗口的左下角看到一个 200×200 像素的矩形——在本例中为正方形!

以上就是快速上手Python GUI库Kivy教程的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取