Kivy 简明教程


首先,有两个网址你不得不看:

  1. Kivy: Cross-platform Python Framework for NUI
    在官网逛逛,顺便看看最下面的代码,try to run it.

  2. https://www.youtube.com/playlist?list=PLQVvvaa0QuDe_l6XiJ40yGTEqIKugAdTy
    sentdex大神的入门级教程。


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. 窗口

As far as I see,在做程序的时候,你会遇到很多窗口。所以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

In fact, 你可以把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()

五阶段:Show time!

还想什么呢?赶紧动手写程序吧~


For more information, you can go and see:

https://kivy.org/docs/api-kivy.uix.screenmanager.html

https://github.com/yingshaoxo/kivy-chat

Kivy 简单尝试的更多相关文章

  1. 简单尝试Spring Cloud Gateway

    简单尝试Spring Cloud Gateway 简介 Spring Cloud Gateway是一个API网关,它是用于代替Zuul而出现的.Spring Cloud Gateway构建于Sprin ...

  2. Python 开发安卓Android及IOS应用库Kivy安装尝试

    Python 开发安卓Android及IOS应用库Kivy安装尝试: 先来看看这货可以用来制作什么应用: Create a package for Windows Create a package f ...

  3. python+selenium 简单尝试

    前言 selenium是一种自动化测试工具,简单来说浏览器会根据写好的测试脚本自动做一些操作. 关于自动化测试,一开始接触的是splinter,但是安装的时候发现它是基于selenium的,于是打算直 ...

  4. react-native学习笔记——简单尝试

    毫无疑问,我是个不善于写博文的人. 毫无疑问,react是个出的框架. 毫无疑问,react-native更是个牛逼的引擎. 我个人对react-native的理解就是js被js引擎编译,去调用本地语 ...

  5. 关于MS12-020一次简单尝试

    由于之前着重于web漏洞,主机漏洞这块比较薄弱.也没有用过metasploit,对于很多系统漏洞还不熟悉,正好这几天不忙,就想着慢慢学习,再写点简单的东西,进行总结记录. 这次尝试的是MS12-020 ...

  6. 简单尝试利用vultr vps自架PPTP上网用于工作学习需要

    因为学习和工作的需要用到登陆海外网站查阅相关的资料和文档,之前有需要使用的时候是问网友索要的账户登录本地电脑拨号的,但是老是跟别人要还是不好,决定自己尝试搭建一个长期使用.看到有不少的介绍提到VULT ...

  7. SQLMap简单尝试

    第一次完成了一个注入呢,虽然是恬不知耻的用sqlmap跑出来的 简单介绍注入时后台的数据等级,有助于后面的理解 ①可以类比成一个装着excel文件的文件夹,每一个excel文件就相当于一个数据库 ②库 ...

  8. 基于node.js的爬虫框架 node-crawler简单尝试

    百度爬虫这个词语,一般出现的都是python相关的资料. py也有很多爬虫框架,比如scrapy,Portia,Crawley等. 之前我个人更喜欢用C#做爬虫. 随着对nodejs的熟悉.发现做这种 ...

  9. 利用 ROP 技术绕过 DEP 保护的一次简单尝试

    \x 01 前言 DEP是数据执行保护的英文缩写,全称为Data Execution Prevention.数据执行保护(DEP) 是一套软硬件技术,能够在内存上执行额外检查以帮助防止在系统上运行恶意 ...

随机推荐

  1. playbook文件内容解释

    [root@node1 playbook]# cat nginx.yml - hosts: test \\主机组,要和nginx.yml在同一个目录下 remote_user: root \\远端执行 ...

  2. 手机通过fiddler调试页面

    fiddler设置 首先我们打开Fiddler->Tools->Fiddler Options在Connection面板里将Allow remote computers to connec ...

  3. DevOps - DevOps工具链

    不要满足于使用世界上已存在的各种方法和技术,而应重点放在希望达到的效果上! 单单使用工具不难,困难的是在团队开发中熟练使用,并形成一套理想的工作流程,只有在团队中工具和思想才能发挥最大价值. 开源工具 ...

  4. python3速查参考- python基础 5 -> 常用的文件操作

    文件的打开方式 打开方式 详细释义 r  以只读方式打开文件.文件的指针会放在文件的开头.这是默认模式. rb  以二进制只读方式打开一个文件.文件指针会放在文件的开头. r+  以读写方式打开一个文 ...

  5. Centos7端口映射

    开启tomcat后,访问需要加端口号8080才能访问,在不改变tomcat默认端口号的情况下,添加nat的端口映射,将80端口映射到8080端口,即可实现不加8080访问. 向nat表的 PREROU ...

  6. LeetCode.1185-一周中的星期几(Day of the Week)

    这是小川的第415次更新,第448篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第266题(顺位题号是1185).给定日期,返回该日期的星期几.输入为三个整数,分别代表日,月和 ...

  7. python类学习

    创建关于汽车的类 class Cars(): def __init__(self, brand, country): self.brand = brand self.country = country ...

  8. soap-ws获取ws中的所有的接口方法

    soap-ws获取wsdl中的所有的接口方法 示例wsdl文件如下,生成的过程可以参考https://www.cnblogs.com/chenyun-/p/11502446.html: <def ...

  9. springboot 论坛项目

    项目演示地址:http://www.mawen.co/ 快速搭建sprintboot项目 运行第一个springboot项目 leaf package hello; import org.spring ...

  10. JS中的继承(上)

    JS中的继承(上) 学过java或者c#之类语言的同学,应该会对js的继承感到很困惑--不要问我怎么知道的,js的继承主要是基于原型(prototype)的,对js的原型感兴趣的同学,可以了解一下我之 ...