简介:
Kivy 是一套用于跨平台快速应用开发的开源框架,只需要编写一套代码,就可运行于各大桌面及移动平台上(包括 Linux、Windows、OS X、Android、iOS、以及 Raspberry Pi), Kivy 采用 Python 和 Cython 编写。
在Windows系统中安装Kivy:
请确保已经安装了 Python3及pip。
一、安装 kivy
- 输入 cmd,启动 Windows 命令行窗口
- pip 安装 kivy 依赖:在 windows 命令行中,执行以下命令
python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew
python -m pip install kivy.deps.gstreamer
- 安装 kivy:在 windows 命令行中,执行以下命令
python -m pip install kivy
- 安装 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 简明教程: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()