SEO只是外表
技术才是我的追求

Python Kivy学习笔记3 – KV文件

KV文件

使用Kivy布局,你会发现界面越复杂代码接越臃肿,不断地使用add_widget()添加控件。Kivy其实提供了一种将界面布局和功能函数分开的方法,就是.kv文件

KV文件类似于HTML和CSS的语言,它负责为显示设置样式和添加控件,但不处理任何逻辑。

KV文件的规则:

KV文件的创建要符合一定的规则:

1、命名:.kv文件的名称必须遵循以下规则,python/kivy才能够查看和加载文件。

  • 必须全部小写
  • 它必须与你的主类名称匹配。 (具有build方法的那个)
  • 如果您的主类名称以“app”(小写或大写)结尾,则文件名中不得包含“app”。

2、文件位置:必须与你的python脚本位于同一目录中。

3、文件扩展名:文件必须以.kv结尾

KV文件的例子:

Python Kivy学习笔记2的代码为例子,原来的代码(不带事件绑定)变成:

mport kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.widget import Widget


class MyGrid(Widget):
    pass


class MyApp(App): # <- Main Class
    def build(self):
        return MyGrid()


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

class名称是MyApp, 因此,kv文件命名为my.kv(全小写、与主类名称相同、不包含app)。

my.kv文件内容如下:

# Filename: my.kv

<MyGrid>:
    GridLayout:
        cols:1
        size: root.width, root.height

        GridLayout:
            cols:2

            Label:
                text: "Name: "

            TextInput:
                multinline:False

            Label:
                text: "Email: "

            TextInput:
                multiline:False

        Button:
            text:"Submit"
            on_press: app.btn()

关于kv文件需要记住的两个重要事项:

  • 大写很重要
  • 缩进很重要

类格式:<MyGrid>(尖括号)

布局和控件格式:GridLayoutLabel(大写首字母)

大概格式:类 – (缩进)布局或控件 – (缩进)布局或控件属性

三个KV语言的关键词:

  • app: 指向你应用程序的实例。
  • root: 指向当前规则中的基础控件或者基础模板(当前类)。
  • self: 指向当前的控件。
https://github.com/Zen-CODE/kivybits/blob/master/IDE/PyCharm_kv_completion.jar是个Pycharm的插件,可以提供Kivy语言的自动补齐和代码高亮。打开 Pycharm 的主菜单,点击 File 文件 -> Import 导入 ( 或者 Import Settings 导入设置);

Python代码读取在Kv中定义的控件

kv文件中已经定义了各种布局和控件,那么在python代码中如何读取这些布局和控件(文本输入框、按钮)来实现各种功能呢?

有两种方法读取kv文件的控件,分别是:

1、通过对象属性

我们可以通过对象属性(Object Properties)实现对kv文件中创建控件的引用。

要设置对象属性,需要从.kv文件中创建全局变量,并将这些变量分配给特定控件的id属性。

更改后的python代码和kv文件如下:

import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty


class MyGrid(Widget):
    name = ObjectProperty(None)
    email = ObjectProperty(None)

    def btn(self):
        print("Name:", self.name.text, "email:", self.email.text)
        self.name.text = ""
        self.email.text = ""


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


if __name__ == "__main__":
    MyApp().run()
<MyGrid>:

    name: name
    email: email

    GridLayout:
        cols:1
        size: root.width - 200, root.height -200
        pos: 100, 100

        GridLayout:
            cols:2

            Label:
                text: "Name: "

            TextInput:
                id: name
                multiline:False

            Label:
                text: "Email: "

            TextInput:
                id: email
                multiline:False

        Button:
            text:"Submit"
            on_press: root.btn()

name是一个ObjectProperty对象,在类内被初始化为None

self.name保存了一个到控件的引用,通过kv文件中name这个id来识别,可以在类内的各个地方来使用。

2、通过id标签

通过id标签,在kv语言中可以查找对象,这是一种更简单的读取对象的方法。例如:

  Label:
    id: loki
    text: 'loki: I AM YOUR GOD!'
  Button:
    id: hulk
    text: "press to smash loki"
    on_release: root.hulk_smash()

在你的Python代码中:

class Marvel(BoxLayout):
    def hulk_smash(self):
        self.ids.hulk.text = "hulk: puny god!"
        self.ids["loki"].text = "loki: >_  # alternative syntax

当你的kv文件被解析的时候,kivy会选中所有带有标签id的控件,然后把它们放到self.ids这样一个辞典类型的属性里面去。所以你就可以对这些控件进行遍历,然后像是辞典数据一样来进行读取类:

for key, val in self.ids.items():
    print("key={0}, val={1}".format(key, val))
虽然这种self.ids方法非常简便,但通常最推荐的还是用对象属性。这样会创建一个直接的引用,能提供更快地读取速度,并且也更加准确可靠。

未经允许不得转载:棋哥SEO博客 » Python Kivy学习笔记3 – KV文件

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址