kivy:安装并使用Kivy、应用python + kv语言

kivy:安装并使用Kivy、应用python + kv语言

一、安装 Kivy

安装 Kivy官方文档

pip install kivy

或者

python -m pip install kivy

若安装失败,也要更新pip(下方)再重新安装

二、创建虚拟环境(可选)

virtualenv 虚拟环境安装方法、virtualenv 官方文档

1.更新 pip

"(python位置)···\···\python.exe" -m pip install --upgrade pip

2.安装 virtualenv

在命令窗口里进入虚拟环境的保存路径(自己创建文件夹),如pythonVirtualenv为保存虚拟环境的文件夹,则

D:\pythonVirtualenv

进入路径后输入

virtualenv -p "(python位置)···\···\python.exe" testEnvrms

其中 testEnvrms为虚拟环境的名称(自己定义)

3.激活 virtualenv

环境路径 + Scripts\activate,如

D:\pythonVirtualenv\testEnvrms\Scripts\activate

4.退出 virtualenv

在命令行输入

deactivate

三、测试 Kivy

(我目前的kivy版本为v2.1.0)

Kivy官方示例文档

from kivy.app import App

from kivy.uix.label import Label

class TestApp(App):

def build(self):

return Label(text='hello world')

if __name__ == '__main__':

TestApp().run()

结果

使用 kivy 显示hello world

四、python 使用 kv语言

kv 详细文档

(一)引用kv文件

命名规则:继承了App的类名,且除去 'App'三个字母的小写再 + '.kv'。如 class MyApp(App) 的kv文件为 my.kv、class TestApp(App)的kv文件为 test.kv。

kv文件命名方式官方文档

有两种方法可以将 Kv 代码加载到您的应用程序中:

按名称约定:

Kivy 查找与您的 App 类同名的小写 Kv 文件,如果它以 'App' 结尾,则减去“App”,例如:

MyApp -> my.kv

如果此文件定义了一个Root Widget,它将附加到 App 的root 属性并用作应用程序小部件树的基础。

Builder:您可以告诉 Kivy 直接加载字符串或文件。如果此字符串或文件定义了根小部件,它将由以下方法返回:

Builder.load_file('path/to/file.kv')

或者:

Builder.load_string(kv_string)

情况①:若py文件和kv文件在同一目录文件夹下,可直接使用kv文件(不用添加Builder)

main.py

from kivy.app import App

# 类名为 MyApp

class MyApp(App):

pass

if __name__ == '__main__':

MyApp().run()

my.kv(对应的类名为 MyApp)

#:kivy 2.1.0

BoxLayout:

# 若不需要 Button 的底纹,可添加:background_normal: ''

Button:

text: "yesssssssss!"

background_color: 0, 0.5, 0.6, 0.5

Button:

text: "nooooooo!"

background_color: 0, 0.3, 0.9, 0.5

结果

继承自App的类使用myapp.kv

情况②:若py文件和kv文件在不在同一目录下,需要加Builder导入

Builder官方文档

main.py

from kivy.app import App

from kivy.lang import Builder

class MyApp(App):

def build(self):

# 此为相对路径,也可以使用绝对路径

return Builder.load_file(r"kvfiles\my.kv")

if __name__ == '__main__':

MyApp().run()

my.kv

#:kivy 2.1.0

FloatLayout:

# 若不需要 Button 的底纹,可添加:background_normal: ''

Button:

text: "hello world"

background_color: 0, 0.2, 0.65, 0.5

结果

使用Builder导入kv文件

情况③:若需要在python里使用自定义的小部件类,则需在kv文件里加上 <自定义的类名>:

"一个类规则,由< >之间的小部件类的名称声明,后跟:,定义该类的任何实例的外观和行为"

:

main.py

from kivy.app import App

from kivy.lang import Builder

from kivy.uix.boxlayout import BoxLayout

# 重新定义一个 BoxLayout ,类名为 TestLayout

class TestLayout(BoxLayout):

# 若没有逻辑代码直接pass

# pass

def doSomething(self):

print("dosomething")

class TestApp(App):

Builder.load_file(r"kvfiles\test.kv")

def build(self):

return TestLayout()

if __name__ == '__main__':

TestApp().run()

test.kv(自定义的类名"")

#:kivy 2.1.0

:

Button:

text: "one btn"

background_color: 0, 0.6, 0.9, 0.5

Button:

text: "two btn"

background_color: 0, 0.4, 0.3, 0.5

结果

含有自定义的类的kv文件效果

(二)kv文件里的控件绑定事件

事件绑定官方文档

您还可以 on_ 在您的 kv 语言中处理事件。例如,TextInput 类有一个focus属性,其自动生成的 on_focus 事件可以在 kv 语言中访问,如下所示:

TextInput:

on_focus: print(args)

如果需要在kv文件里绑定python里的方法,可以加上关键字:

Kv 语言特有的三个关键字:

app :总是指您的应用程序的实例。

root :指当前规则中的基本小部件/模板

self :始终引用当前小部件

示例一:在按钮中绑定类里的方法

main.py

import kivy

from kivy.app import App

from kivy.lang import Builder

from kivy.uix.anchorlayout import AnchorLayout

# 固定布局

class MyLayout(AnchorLayout):

Builder.load_file(r"kvfiles\mygui.kv")

def doSomething(self):

print("hello world.")

class MyGUIApp(App):

def build(self):

mylayout = MyLayout();

return mylayout

if __name__ == '__main__':

MyGUIApp().run()

mygui.kv

#:kivy 2.1.0

:

anchor_x: "center"

anchor_y: "bottom"

Button:

text: "hello"

# 设置按钮的尺寸

size_hint: 0.2, 0.2

# 调用方法,也可以直接写 on_press: print("hello world")

on_press: root.doSomething()

结果

按钮绑定方法测试结果

示例二:在自定义模板里调用类里的方法循环添加另一个自定义模板,模板代替重复小部件、python里实例化自定义模板详细文档

my.py

from kivy.app import App

from kivy.lang import Builder

from kivy.factory import Factory

from kivy.uix.stacklayout import StackLayout

class MyStackLayout(StackLayout):

def addLabelWidget(self):

i = 0

while(i < 5):

# 用 Factory 实例化自定义模板,每次生成新的一个自定义模板都得 Factory.xxx(),即不可放在循环外面

mylabel = Factory.MyLabel()

mylabel.text = str(i)

i += 1

#print(self)

self.add_widget(mylabel)

class MyApp(App):

Builder.load_file("kvfiles\my.kv")

def build(self):

return MyStackLayout()

if __name__ == '__main__':

MyApp().run()

my.kv

#:kivy 2.1.0

:

size_hint: (0.2, 0.2)

font_size: 20

color: (0, 0, 0, 1)

canvas:

Color:

rgba: (1, 233/255, 224/255, 0.5)

Rectangle:

size: self.size

pos: self.pos

:

background_normal: ''

background_color: (0, 0.2, 0.65, 0.5)

size_hint: (0.2, 0.2)

# 若是自定义控件模板里的按钮(控件)想调用方法,则需要加上 'app' 关键字:

on_release: app.root.addLabelWidget()

:

#绘制白色背景

canvas:

Color:

rgba: (1, 1, 1, 1)

Rectangle:

size: self.size

pos: self.pos

MyButton:

text: "增加Lable!"

结果:

按钮on_release.gif

(三)滚动视图ScrollView

滚动视图官方文档

示例:尝试在ScrollView里放入一个能在y轴上滚动的布局

main.py

from kivy.app import App

from kivy.lang import Builder

class MainApp(App):

def build(self):

return Builder.load_file("kvfiles\main.kv")

if __name__ == '__main__':

MainApp().run()

main.kv

滚动视图关键是:

① 如果要在x或y轴其中一条轴上滚动,那么需使子项(ScrollView下的布局或其它控件)中的 size_hint_x 或 size_hint_y 为 None(若都设为None,则x与y轴都有可能滚动)

② 设置ScrollView的 do_scroll_x与do_scroll_y的布尔值(若都设为True,则x与y轴都能滚动)

③ (很重要)设置好子项的 height 或 width

#:kivy 2.1.0

BoxLayout:

# 绘制白色背景

canvas:

Color:

rgba: (1, 1, 1, 1)

Rectangle:

size: self.size

pos: self.pos

# 滚动视图

ScrollView:

# 在y轴上滚动

do_scroll_x: False

do_scroll_y: True

# 使用鼠标滚轮滚动时移动的距离

scroll_wheel_distance: 20

# 滚动类型:滑动条滚动、直接拖到内容滚动

scroll_type: ['bars', 'content']

# 滑动条宽度

bar_width: 20

# 滑动条拉动时的颜色

bar_color: [62/255, 154/255, 197/255, 0.8]

# 没滑动内容时的颜色

bar_inactive_color: [62/255, 154/255, 197/255, 0.5]

# 放入布局

StackLayout:

orientation: 'lr-tb'

#padding: 5

#spacing: 20

size_hint_y: None

# Button默认高度为 100,放置了9个Button,即总高度为900;也可在python里设置循环添加按钮,自动计算高度

height: 900

Button:

id: idbtn

text: str(idbtn.height)

size_hint: (1, None)

Button:

text:"按钮2"

size_hint: (1, None)

Button:

text:"按钮3"

size_hint: (1, None)

Button:

text:"按钮4"

size_hint: (1, None)

Button:

text:"按钮5"

size_hint: (1, None)

Button:

text:"按钮6"

size_hint: (1, None)

Button:

text:"按钮7"

size_hint: (1, None)

Button:

text:"按钮8"

size_hint: (1, None)

Button:

text:"按钮9"

size_hint: (1, None)

结果:

ScrollView.gif

(四)窗口固定尺寸与最小尺寸

# 窗口初始化时的尺寸

from kivy.config import Config

# width、height数值自行设置

Config.set('graphics', 'width', '1300')

Config.set('graphics', 'height', '750')

from kivy.core.window import Window

# 窗口的最小尺寸

Window.minimum_width = 1300

Window.minimum_height = 750

(五)中文乱码问题解决(以微软雅黑为例)

第一步:将中文字体文件复制到虚拟环境所在文件夹(或python所在文件夹)>Lib\site-packages\kivy\data\fonts

第二步:C盘里.kivy文件的config.ini里面,找到“default_font”一栏,更改为

default_font = ['Microsoft YaHei UI', 'data/fonts/msyh.ttc']