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>
(尖括号)
布局和控件格式:GridLayout
、Label
(大写首字母)
大概格式:类 – (缩进)布局或控件 – (缩进)布局或控件属性
三个KV语言的关键词:
app
: 指向你应用程序的实例。root
: 指向当前规则中的基础控件或者基础模板(当前类)。self
: 指向当前的控件。
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
方法非常简便,但通常最推荐的还是用对象属性。这样会创建一个直接的引用,能提供更快地读取速度,并且也更加准确可靠。