Kivy是一个很优秀的,基于Python的GUI库,可以利用Python快速编程的特点,快速的编写windows, linux, mac, android, ios等主流平台的应用程序。同wxPython、PyQt相比,最大的优点是可以快速地编写移动应用程序。
在 windows 命令行中,执行以下命令
python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew
python -m pip install kivy.deps.gstreamer
python -m pip install kivy
以上如果安装过慢,可以使用清华镜像:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
安装kivy官方示例
python -m pip install kivy_examples
验证kivy安装成功:
from kivy.app import App
from kivy.uix.button import Button
class TestApp(App):
def build(self):
return Button(text='iPaoMi')
TestApp().run()
你将看到执行上面的 Python 代码,会运行如下的窗口,这可以算是 kivy 版的 hello world 了。
如果测试的时候报错时,可以用idea这个开发工具,简单、快速
在这里强烈建议大家去下载一个idea当开发工具,虽然需要花时间学怎样导包等等之类的问题,但是学会了基本操作就会避免菜很多不必要的吭坑阬。。。
创建一个kivy应用程序步骤:
下面是一个最小化应用程序的例子:
import kivy
kivy.require('1.0.6') # 用你当前的kivy版本替换
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text='Hello world')
if __name__ == '__main__':
MyApp().run()
你的应用程序的基类需要继承APP类,它在kivy_installation_dir/kivy/app.py中。
提示:如果你想进一步的研究APP类,你可以打开该文件进行深入的探讨。我们鼓励你重读它的代码。Kivy是基于Python实现的并且其文档都在实际的文件里。from kivy.app import App。
将简单程序写好后可以在各个平台运行,其中在Android上运行需要打包,参考地址:
https://kivy.org/doc/stable/guide/packaging-android.html
下面让我们扩展一下,做一个简单的用户名/密码的输入页面。
我们使用网格布局以两列来管理它(app)的孩子们,并且每行添加了一个标签和一个文本输入框。
运行程序如图:
# -*- encoding: utf-8 -*-
import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
kivy.require("1.11.1")
fonts = "./SourceHanSerifSC-Regular.otf"
# 页面一
class ConnectPage(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.cols = 3
self.add_widget(Label(text="号码:",font_name=fonts))
self.ip = TextInput(multiline=False,font_name=fonts)
self.add_widget(self.ip)
self.add_widget(Label(text="说明:",font_name=fonts))
self.add_widget(Label(text="号段:",font_name=fonts))
self.port = TextInput(multiline=False,font_name=fonts)
self.add_widget(self.port)
self.add_widget(Label(text="说明:",font_name=fonts))
self.add_widget(Label(text="Sheet个数:",font_name=fonts))
self.name = TextInput(multiline=False,font_name=fonts)
self.add_widget(self.name)
self.add_widget(Label(text="说明:",font_name=fonts))
self.join = Button(text="运行",font_name=fonts)
self.join.bind(on_press=self.join_button) # 点击它就会弹出另一个页面
self.add_widget(Label())
self.add_widget(Label())
self.add_widget(self.join)
def join_button(self, instance):
port = self.port.text
ip = self.ip.text
name = self.name.text
info = f"{port} {ip} {name}"
chat_app.info_page.update_info(info)# 调用页面二的方法 赋值显示
chat_app.screen_manager.current ="Info" # 加载页面渲染信息
# 页面二
class InfoPage(GridLayout):
def __init__(self,**kwargs):
super().__init__(**kwargs)
self.cols = 1
self.message = Label(halign="center", valign="middle", font_size=30,font_name=fonts)
self.message.bind(width=self.update_text_width)
self.add_widget(self.message)
def update_info(self,message):
self.message.text = message
def update_text_width(self,*_):
self.message.text_size = (self.message.width*0.9,None)
# 程序对象
class EpicApp(App):
def build(self):
self.screen_manager = ScreenManager() # 渲染的页面==>屏幕==>屏幕管理器
self.connect_page = ConnectPage() # 页面一
screen = Screen(name="Connect")
screen.add_widget(self.connect_page)
self.screen_manager.add_widget(screen)
self.info_page = InfoPage() # 页面二
screen = Screen(name="Info")
screen.add_widget(self.info_page)
self.screen_manager.add_widget(screen)
return self.screen_manager
if __name__ == '__main__':
chat_app = EpicApp()
chat_app.run()
点击运行