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.kvclass 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文件里加上 <自定义的类名>:

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

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(自定义的类名"<TestLayout>")

#:kivy 2.1.0

<TestLayout>:
    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

<MyLayout>:
    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
<MyLabel@Label>:
    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

<MyButton@Button>:
    background_normal: ''
    background_color: (0, 0.2, 0.65, 0.5)
    size_hint: (0.2, 0.2)
    # 若是自定义控件模板里的按钮(控件)想调用方法,则需要加上 'app' 关键字:
    on_release: app.root.addLabelWidget()

<MyStackLayout>:
    #绘制白色背景
    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_xsize_hint_yNone(若都设为None,则x与y轴都有可能滚动)
② 设置ScrollView的 do_scroll_xdo_scroll_y的布尔值(若都设为True,则x与y轴都能滚动)
③ (很重要)设置好子项的 heightwidth

#: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']

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容