美文网首页Python待用
kivy:安装并使用Kivy、应用python + kv语言

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

作者: 靗鲭 | 来源:发表于2022-08-19 16:21 被阅读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']

    相关文章

      网友评论

        本文标题:kivy:安装并使用Kivy、应用python + kv语言

        本文链接:https://www.haomeiwen.com/subject/rodhirtx.html