Kivy 简单尝试
Kivy 简明教程
首先,有两个网址你不得不看:
Kivy: Cross-platform Python Framework for NUI
在官网逛逛,顺便看看最下面的代码,try to run it.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代码中绑定了两个Screen
class,还引用了一个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:
Kivy 简单尝试的更多相关文章
- 简单尝试Spring Cloud Gateway
简单尝试Spring Cloud Gateway 简介 Spring Cloud Gateway是一个API网关,它是用于代替Zuul而出现的.Spring Cloud Gateway构建于Sprin ...
- Python 开发安卓Android及IOS应用库Kivy安装尝试
Python 开发安卓Android及IOS应用库Kivy安装尝试: 先来看看这货可以用来制作什么应用: Create a package for Windows Create a package f ...
- python+selenium 简单尝试
前言 selenium是一种自动化测试工具,简单来说浏览器会根据写好的测试脚本自动做一些操作. 关于自动化测试,一开始接触的是splinter,但是安装的时候发现它是基于selenium的,于是打算直 ...
- react-native学习笔记——简单尝试
毫无疑问,我是个不善于写博文的人. 毫无疑问,react是个出的框架. 毫无疑问,react-native更是个牛逼的引擎. 我个人对react-native的理解就是js被js引擎编译,去调用本地语 ...
- 关于MS12-020一次简单尝试
由于之前着重于web漏洞,主机漏洞这块比较薄弱.也没有用过metasploit,对于很多系统漏洞还不熟悉,正好这几天不忙,就想着慢慢学习,再写点简单的东西,进行总结记录. 这次尝试的是MS12-020 ...
- 简单尝试利用vultr vps自架PPTP上网用于工作学习需要
因为学习和工作的需要用到登陆海外网站查阅相关的资料和文档,之前有需要使用的时候是问网友索要的账户登录本地电脑拨号的,但是老是跟别人要还是不好,决定自己尝试搭建一个长期使用.看到有不少的介绍提到VULT ...
- SQLMap简单尝试
第一次完成了一个注入呢,虽然是恬不知耻的用sqlmap跑出来的 简单介绍注入时后台的数据等级,有助于后面的理解 ①可以类比成一个装着excel文件的文件夹,每一个excel文件就相当于一个数据库 ②库 ...
- 基于node.js的爬虫框架 node-crawler简单尝试
百度爬虫这个词语,一般出现的都是python相关的资料. py也有很多爬虫框架,比如scrapy,Portia,Crawley等. 之前我个人更喜欢用C#做爬虫. 随着对nodejs的熟悉.发现做这种 ...
- 利用 ROP 技术绕过 DEP 保护的一次简单尝试
\x 01 前言 DEP是数据执行保护的英文缩写,全称为Data Execution Prevention.数据执行保护(DEP) 是一套软硬件技术,能够在内存上执行额外检查以帮助防止在系统上运行恶意 ...
随机推荐
- mysql 如何给大表添加字段
1. 能不加字段就不要加, 能不修改字段就不要修改, 能不删除字段就不要删除, 等等为什么要删除字段呢? 如果没事,不要蛋疼的找事. 实际上,我们那次更新失败后, 我们并没有增加那个字段, 然后我们一 ...
- kettle记录集(Merge Join)使用
果两个表需要进行连接查询筛选出数据,那么可以使用记录集组件.(Merge Join). 使用之前要进行排序: 使用记录集之前,要对输入的两张表进行排序,如果不排序,会导致两张表连接的时候出现问题,关联 ...
- StringJoiner,StringBuffer的一些lamada写法
public String friendlyText(List data) { if(CollectionUtils.isEmpty(data)) { return "[]"; } ...
- 用shader实现流动的水面(webgl)
这段时间一直在看如何用shader绘制一个流动的水面,直接用贴图(高度图.法向贴图)实现的方法,这里就不讨论了. 搜了一大波博客资料,感觉存在如下一些问题: 1⃣️大多数资料都是基于opengl实现( ...
- python基础知识(函数2)
返回值 return return[value] 多个值用,逗号分开,没有返回值,会返回none值,函数不给指定返回值也会返回none值 def functionname(p1,p2,p3): re ...
- slice详解
- UE4 RHI(2)
在上篇简单说明RHI的作用后, 我们在引擎中探索一下RHI的种种细节与实现. 在解决方案资源管理器中搜索RHI, 会有这些文件: (1)对应不同运行平台的PlatformDynamicRHI.cpp( ...
- JoinableQueue队列,线程,线程于进程的关系,使用线程,线程的特点,守护线程,线程的互斥锁,死锁问题,递归锁,信号量
1.JoinableQueue队列 JoinableQueue([maxsize]):这就像是一个Queue对象,但是队列允许项目的使用者通知生成者项目已经被成功处理.通知进程是使用共享的信号和条件变 ...
- mybatis 基于xml 配置的映射器
cache 给命名空间的缓存配置 cache-ref 其他命名空间缓存配置的引用 resultMap 描述如何从数据库结果集中来加载对象 <!--column不做限制,可以为任意表的字段,而p ...
- 安装cinder
在控制节点上安装 备注:安装cinder时,nova-compute创建虚拟机时会默认使用cinder指定的存储方式,所以,如果你还要使用本地存储的话,请先参考我这边文章进行设置: 配置nova-co ...