Kivy跨平台开源框架

简介:
Kivy 是一套用于跨平台快速应用开发的开源框架,只需要编写一套代码,就可运行于各大桌面及移动平台上(包括 Linux、Windows、OS X、Android、iOS、以及 Raspberry Pi), Kivy 采用 Python 和 Cython 编写。

在Windows系统中安装Kivy:
请确保已经安装了 Python3及pip。
一、安装 kivy

  1. 输入 cmd,启动 Windows 命令行窗口
  2. pip 安装 kivy 依赖:在 windows 命令行中,执行以下命令
python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew
python -m pip install kivy.deps.gstreamer
  1. 安装 kivy:在 windows 命令行中,执行以下命令
python -m pip install kivy
  1. 安装 kivy 官方示例:在 windows 命令行中,执行以下命令
python -m pip install kivy_examples

二、验证 kivy
在 IDLE 中输入下面代码

from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='iPaoMi')
        
TestApp().run()

执行上面的代码,会运行如下:

在这里插入图片描述
在这里插入图片描述

最终通过 kivy 提供的打包工具,可以将 kivy 程序打包,运行到不同的平台上。

Kivy 简明教程:https://www.kancloud.cn/gthank/kivydoc/127793
Kivy总体思想是:Kv代码管界面,Python代码管逻辑;Kv访问Python,Python访问Kv,窗口。
一阶段:
1、Python访问Kv:Python可以直接调用Kv代码。如:

from kivy.app import App
from kivy.lang import Builder

kv = Builder.load_string('''
Button:
    text: "I was created by kv codes."
''')
class TestApp(App):
    def build(self):
        return kv

TestApp().run()

2、窗口:kv代码中被<>包裹住的是某个class的名称,这个class需在python代码中声明,它们代表同一个class。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    Label:
        text: "My mother screen was created by kv and python codes."
''')
class OneScreen(Screen):
    pass
class TestApp(App):
    def build(self):
        return OneScreen()

TestApp().run()

3、 kv访问Python:在.kv文件或kv代码里,root只代表其上层被<>包裹住的类。如:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    Button:
        text: 'Click me'
        on_release: print(root.__class__)
''')
class OneScreen(Screen):
    pass
class TestApp(App):
    def build(self):
        return OneScreen()

TestApp().run()

二阶段:
1、 kv访问Python

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    BoxLayout:
        Button:
            text: 'Click me'
            on_release: root.do_something()
        Button:
            text: 'Who made this?'
            on_release: print(root.author)
''')
class OneScreen(Screen):
    def __init__(self, **kwargs):
        self.author = 'yingshaoxo'
        super(OneScreen, self).__init__(**kwargs)
        
    def do_something(self):
        print('2333')
class TestApp(App):
    def build(self):
        return OneScreen()

TestApp().run()

2、 Python访问kv:需要给kv组件一个id,用以标明其唯一性。再使用ids方法调用它。如:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    BoxLayout:
        Button:
            id: one_ask
            text: 'Who made this?'
            on_release: root.do_something()
''')
class OneScreen(Screen):
    def __init__(self, **kwargs):
        self.author = 'yingshaoxo'
        super(OneScreen, self).__init__(**kwargs)
        
    def do_something(self):
        self.ids['one_ask'].text = self.author
class TestApp(App):
    def build(self):
        return OneScreen()

TestApp().run()

3、 窗口:做程序的时候,会遇到很多窗口,这时ScreenManager就派上用场了。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager

Builder.load_string('''
<ScreenManager>:
    Screen:
        name: 'home'
        Button:
            text: 'Go to another screen'
            on_release: root.current = 'another'
            
    Screen:
        name: 'another'
        Button:
            text: "Go back home"
            on_release: root.current = 'home'
''')
class ScreenManager(ScreenManager):
    pass
class TestApp(App):
    def build(self):
        return ScreenManager()

TestApp().run()

三阶段:
1+2、 窗口、kv访问Python:可以把ScreenManager看成一个很大的widget,但如果所有的数据操作(root.function)都在一个 ScreenManager class里做的话显然不科学,所以最好把每个窗口都在Python里声明一个class,这样既可以有程序启动时的总操作,又可以有各个子窗口的分操作。如:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

Builder.load_string('''
<ScreenManager>:
    HomeScreen
    AnotherScreen

<HomeScreen>:
    name: 'home'
    Button:
        text: 'Go to another screen'
        on_release: root.manager.current = 'another'

<AnotherScreen>:
    name: 'another'
    Button:
        text: "Go back home"
        on_release: root.manager.current = 'home'
''')
class ScreenManager(ScreenManager):
    pass
class HomeScreen(Screen):
    pass
class AnotherScreen(Screen):
    pass
class TestApp(App):
    def build(self):
        return ScreenManager()

TestApp().run()

可以看到示例不光在kv代码中绑定了两个Screenclass,还引用了一个root.manager。没错,那是从screen class得到screenmanager class的方法。
3、 Python访问kv:直接用kv代码预先定义控件(如按钮)的行为有时不能满足需求,可能需要临时改变按钮的行为:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from time import gmtime, strftime # this equls cv codes #...

Builder.load_string("""
#:import gmtime time.gmtime
#:import strftime time.strftime

<RootWidget>
    BoxLayout:
        orientation: 'vertical'
        Button:
            id: change_itself
            text: 'I can change myself'
            on_release: root.ids['change_itself'].text = strftime("%a, %d %b %Y %H:%M:%S", gmtime())
        Button:
            id: change_all
            text: 'I can change our behavior'
            on_release: root.change_all()
""")
class RootWidget(Screen):
    def change_all(self):
        print(self.ids)
        for instance_class in self.ids.values():
            instance_class.text = 'Exit'
            instance_class.bind(on_release=exit)
class TestApp(App):
    def build(self):
        return RootWidget()
if __name__ == '__main__':
    TestApp().run()

四阶段:
1、 kv访问Python

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    Label:
        text: app.saying
''')
class OneScreen(Screen):
    pass
class TestApp(App):
    def __init__(self, **kwargs):
        self.saying = 'I was read from app instance.'
        super(OneScreen, self).__init__(**kwargs)

    def build(self):
        return OneScreen()

TestApp().run()

猜你喜欢

转载自blog.csdn.net/qq_38882327/article/details/89083948