Kivy教程:如何使用Python Kivy构建GUI应用程序?

2021年9月17日22:56:50 发表评论 4,229 次浏览

在之前的教程中,你看到了如何使用Tkinter和PyQt5构建 GUI 应用程序。在本教程中,我们将继续构建桌面 GUI 应用程序,但这次使用 Kivy。

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

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

如何使用Python Kivy?你可以使用称为 Kv 语言的中间语言设计 Kivy 小部件,稍后你将看到Python Kivy用法示例。

在开始使用 Kivy 之前,需要具备Python 编程基础知识。现在,让我们开始安装。

Python Kivy使用教程目录

  • 安装
  • 图形用户界面
  • Kivy按钮
    • 更改 Kivy 按钮的颜色
    • 禁用 Kivy 按钮
    • 改变大小和位置
    • Kivy Button 中的图像
    • 加载 Kv 字符串或文件
  • Kivy标签
    • 更改字体大小
    • 为标签中的文本添加样式
  • Kivy RecycleView
  • Kivy 滚动视图
  • Kivy 清除文本输入
  • Kivy时钟
  • Kivy帆布
  • 画布图像
  • Kivy 与 PyQt

安装

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

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

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

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

python -m pip install --upgrade pip wheel setuptools
Kivy教程:如何使用Python Kivy构建GUI应用程序?
  1. 现在我们必须安装依赖项。执行以下命令:
python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew

然后:

python -m pip install kivy.deps.gstreamer
Kivy教程:如何使用Python Kivy构建GUI应用程序?
  1. 为 Kivy 安装依赖项后,使用以下命令安装 Kivy:
python –m pip install kivy
Kivy教程:如何使用Python Kivy构建GUI应用程序?

图形用户界面

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

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

Python Kivy使用教程:要创建 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教程:如何使用Python Kivy构建GUI应用程序?

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

如何使用Python Kivy?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教程:如何使用Python Kivy构建GUI应用程序?

按钮会填满窗口,别担心,我们稍后会调整它的大小。

更改 Kivy 按钮的颜色

Kivy 按钮的默认颜色是灰色。你可以通过在格式 (r, g, b, a) 中指定background_color属性来更改颜色。Python Kivy代码示例如下:

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教程:如何使用Python Kivy构建GUI应用程序?

禁用 Kivy 按钮

Python 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()

在上面的代码中,我们从functools 中导入了部分函数,以便我们可以使用bind()函数。

一个KivyButton()类有两个自定义方法创建的。第一种方法是disable()方法。你可以随意命名。

然后我们有update()方法在点击按钮后更新按钮的文本。此外,你可以根据需要命名你的函数。

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

disable()函数的返回值绑定到我们按钮的on_press函数。因此,当按钮被按下时,它首先被禁用,然后更新文本。

输出是这样的:

Kivy教程:如何使用Python Kivy构建GUI应用程序?

改变大小和位置

使用按钮小部件的 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()

以下输出将如下所示:

Kivy教程:如何使用Python Kivy构建GUI应用程序?

所述POS参数指定按钮的位置,同时size_hint参数指定按钮的大小。

Kivy Button 中的图像

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

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

from kivy.app import App

from kivy.uix.boxlayout import BoxLayout

from kivy.lang import Builder

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

Python Kivy使用教程:加载 Kv 字符串或文件

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

如果你的类是TestApp,那么它将在同一目录中搜索名为test.kv的 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()

同样,你可以使用load_file方法从单独的文件加载 Kv 字符串,如下所示:

Builder.load_file("myfile.kv")

此处的文件包含所有 Kivy 小部件定义。

如何使用Python Kivy?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()
Kivy教程:如何使用Python Kivy构建GUI应用程序?

为标签中的文本添加样式

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

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

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教程:如何使用Python Kivy构建GUI应用程序?

Kivy RecycleView

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

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

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

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

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

  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)]

其中

__init__

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

class RecycleApp(App):

    def build(self):

        return ExampleRV()

RecycleApp().run()

所以完整Python Kivy代码示例会是这样的:

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教程:如何使用Python Kivy构建GUI应用程序?

Python Kivy用法示例: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教程:如何使用Python Kivy构建GUI应用程序?

Kivy 清除文本输入

Python 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))

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

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

因此,当我们按下按钮时,文本将被擦除。

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

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

self.box.add_widget(self.txt)

self.box.add_widget(self.btn)

明文方法如下所示:

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教程:如何使用Python Kivy构建GUI应用程序?

如何使用Python Kivy?Kivy时钟

你可以使用 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

所述DT参数用于调度和回调函数的调用之间经过的时间。如果没有传递参数,它会抛出一个关于回调函数的错误,它接受一个位置参数,但给出了两个。

完整Python Kivy代码示例如下所示:

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 秒,按钮文本将按预期更改。

Kivy教程:如何使用Python Kivy构建GUI应用程序?

Kivy画布

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

我们将在 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()

输出将是这样的:

Kivy教程:如何使用Python Kivy构建GUI应用程序?

Python Kivy用法示例:画布图像

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

kvWidget 字符串将如下Python Kivy代码示例所示:

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

如何使用Python Kivy?和 Kivy 一样,我们也使用 PyQt 来创建 GUI 应用程序,但 PyQt 在开发桌面应用程序方面更受欢迎。

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

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

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

我希望你找到合适的 Python GUI 框架来构建你需要的东西,以上就是Python Kivy使用教程的全部内容,希望这些内容可以帮助到你。

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

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: