Python待用

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

2022-08-19  本文已影响0人  靗鲭

一、安装 Kivy

安装 Kivy官方文档

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

上一篇下一篇

猜你喜欢

热点阅读