kivy chapter1~chapter3

Kivy



root widget & child widgets

WeatherRoot:

<WeatherRoot>:
    AddLocationForm

<AddLocationForm>:
    orientation: "vertical"
    search_input: search_box
    search_results: search_results_list
    BoxLayout:
        height: "40dp"
        size_hint_y: None
        TextInput:
            id: search_box
            size_hint_x: 50
        Button:
            text: "Search"
            size_hint_x: 25
            on_press: root.search_location()
        Button:
            text: "Current Location"
            size_hint_x: 25
    ListView:
        id: search_results_list
        adapter:
            ListAdapter(data=[], cls=main.LocationButton)

 <LocationButton>:
   on_press: app.root.show_current_weather(self.text)

 
  1. root widget 形如 WeatherRoot
  2. child widgets 形如 AddLocationForm,LocationButton

其中比较重要的区别定义当中root和app.root的使用,这分别引用(refers to)不懂的对象(object)在KV language file.

app.root始终关联root widget,root则关联‘当前’的widget

Be careful not to confuse the root magic variable, which refers to the leftmost rule in the current indentation block, with app.root,which always refers to the root widget of the app. app.root refers tothe same object anywhere in the KV language file, but root refers to a different thing depending on what rule it is found in.

3.值得注意的是AddLocationForm中ListView Adapter中的main,这里的main指的是类似‘模块’,main.LocationButton则是传递一个‘类模板‘给adpter用于初始化ListView的对象。以下贴出Python code的代码(即main.py):

  对应root widget的class:

class WeatherRoot(BoxLayout):
    def show_current_weather(self, location):
        from kivy.uix.label import Label
        self.clear_widgets()
        # self.add_widget(Label(text=location))
        current_weather = Factory.CurrentWeather()
        current_weather.location = location
        self.add_widget(current_weather)

    def show_add_location_form(self):
        self.clear_widgets()
        self.add_widget(AddLocationForm())

  对应child widget的class:

class AddLocationForm(BoxLayout):
    search_input = ObjectProperty()
    search_results = ObjectProperty()

    def search_location(self):
        search_template = "http://api.openweathermap.org/data/2.5/find?q={}&type=like"
        search_url = search_template.format(self.search_input.text)
        request = UrlRequest(search_url, self.found_location)

    def found_location(self, request, data):
        data = json.loads(data.decode()) if not isinstance(data, dict) else data
        cities = ["{} ({})".format(d[‘name‘], d[‘sys‘][‘country‘]) for d in data[‘list‘]]
        self.search_results.item_strings = cities
        del self.search_results.adapter.data[:]
        self.search_results.adapter.data.extend(cities)
        self.search_results._trigger_reset_populate()

  以及用于生成按钮风格的ListView的class:

class LocationButton(ListItemButton):
    pass

  LocationButton只是单纯地继承ListItemButton.其中LiteItemButton源自:

from kivy.uix.listview import ListItemButton

  

  值得注意的的是root widget WeatherRoot的“属性”(property)设置貌似没有。

WeatherRoot:

<WeatherRoot>:
    AddLocationForm

properties



  通常在网页里面,比如一个文本输入框里面的值是怎么获取的,这就不得不了解property.

  还是以child widget AddLocationForm为栗子:

<AddLocationForm>:
    orientation: "vertical"
    search_input: search_box
    search_results: search_results_list
    BoxLayout:
        height: "40dp"
        size_hint_y: None
        TextInput:
            id: search_box
            size_hint_x: 50
        Button:
            text: "Search"
            size_hint_x: 25
            on_press: root.search_location()
        Button:
            text: "Current Location"
            size_hint_x: 25
    ListView:
        id: search_results_list
        adapter:
            ListAdapter(data=[], cls=main.LocationButton)

  oritation,search_input,height,id,size_hint_x等都是property.

  其中oritation不同于search_input和search_results,search_input和search_results是Python code代码里面的逻辑产生的,KV language file里面引用,只在界面与布局里面简单使用。

  以下是AddLocationForm的对应的Python code,为了阅读简洁,我略去了一个method:

class AddLocationForm(BoxLayout):
    search_input = ObjectProperty()
    search_results = ObjectProperty()

    def search_location(self):
        search_template = "http://api.openweathermap.org/data/2.5/find?q={}&type=like"
        search_url = search_template.format(self.search_input.text)
        request = UrlRequest(search_url, self.found_location)

  对于不同的widget,形如文本输入框或者按钮,对应的属性不同。特别地,还有独有的event property.

Widget


<[email protected]>:
    location: ""
    orientation: "vertical"
    Label:
        text: root.location
    BoxLayout:
        orientation: "horizontal"
        height: "40dp"
        size_hint_y: None
        Button:
            text: "Add Location"
            on_press: app.root.show_add_location_form()
        Button:
            text: "ForeCast"

  CurrentWeathor是一个Layout classes.按《creating app in kivy》作者的说法,Widget有如下分类:

Widgets
Kivy uses the word widget to describe any user interface element. Just a few examplesof widgets include:
• The label you rendered in Example 1-3
• The text input field and buttons you’ll render shortly
• Layout classes that comprise other widgets and determine where they should be displayed
• Complicated tree views such as file pickers
• Movie and photo renderers
• Tabbed boxes that display different widgets depending on the selected tab

I find it convenient to think of a widget as a sort of box that has behaviors and can contain other boxes. The Widget class is the most basic such box.

event



  借助上面的代码,首先聚焦Button,text表名这个button的名称,on_press的值指明了当这个按钮被按下的事件由root widget对应的class的方法来具体响应。再来看看Python Code代码,看看事件具体是如何响应的:

class WeatherRoot(BoxLayout):
    def show_current_weather(self, location):
        from kivy.uix.label import Label
        self.clear_widgets()
        # self.add_widget(Label(text=location))
        current_weather = Factory.CurrentWeather()
        current_weather.location = location
        self.add_widget(current_weather)

    def show_add_location_form(self):
        self.clear_widgets()
        self.add_widget(AddLocationForm())

  1.首先调用clear_widgets方法清除所有widgets(按函数的名称字面上来理解至少是这样的)

  2.然后root widget调用add_widget方法来创建一个新的AddLocationForm‘页面‘(views)

最后形如clear_widget和add_widget方法如同extend、_trigger_reset_populate方法一样,似飞来之物。所以要多看手册文档,甚至作者说的,_trigger_reset_populate方法是一个undocumented method,需要看源代码才能获悉这样的函数(data变化来force an update here),这毋庸置疑需要看ListViews.

self.search_results.adapter.data.extend(cities)
self.search_results._trigger_reset_populate()

2015/05/29

时间: 2024-10-03 02:05:39

kivy chapter1~chapter3的相关文章

Unity编辑器扩展chapter1

Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些小的插件应用的项目工程中去,达到复用的目的.今天首先创建一个新场景生成的菜单项,生成的场景已经绑定好需要的游戏对象及脚本. Tips:1.官方API 2.编辑器扩展脚本都需放在Editor文件夹下,Editor的层级和数目没有要求 EditorUtil.cs :编辑器扩展类,向外部提供编辑器扩展方法

PYTHON PIP和kivy安装教程

我们安装pip.我们同样需要在Python的官网上去下载 下载地址:https://pypi.python.org/pypi/pip 下载完成之后,解压到一个文件夹,用CMD控制台进入解压目录,输入: python setup.py install 安装好之后,我们直接在命令行输入pip,同样会显示'pip'不是内部命令,也不是可运行的程序.因为我们还没有添加环境变量. 然后安装kivy 同样安装地址和官方教程地址:https://kivy.org/docs/installation/insta

两天时间,安装kivy环境,python3.5不行,只能用python2.7

由于手柄一直比较残次,所以打算用手机来控制小车,但是问题又来了,我不会java,怎么写APP? 经过网上一番搜索,发现python也能写手机app,简直高端,但是要安装kivy框架.经过网上一番搜索,发现资料都是一两年以前的内容了,但是这并不妨碍我现在才入坑. 很多资料都写着从官网直接下载然后运行bat文件什么的,但是我去官网看,只能通过pip安装最新版本.并且也支持着python3.5啊! 跟着官网操作,安装了一下午,让我装什么,我就装什么,缺cython,我装,缺visaul stidio,

Kivy a to Z -- 一个简单的通过adb同步Android系统文件的工具

来兴趣时写了些Kivy的代码,调试却总感觉不是很方便.直接打包到public.mp3的方式太繁锁,用文件共享的软件又发现没有一个好用的, 用samba filesharing本来也只是慢,但是更新的版本之后就一直提示说wifi没有tethering,意思是wifi热点没有打开,但是打开了还是提示没有tethering. 找了个叫什么卓*力的文件管理器,下载了samba插件后输入用户名和密码死活不对,被搞得实在恼火,花了点时间写了个通过adb同步安卓文件的工具,用着也挺爽的. 事件为什么总是要搞得

Kivy A to Z -- 如何实现焦点切换效果

Kivy是面向触屏设备的,对键盘,遥控器等输入设备的处理比较弱,但是有时候我们又需要实现对按键的处理,如通过方向键切换焦点,这篇文章来讨论下如何去实现. 在看下面的代码之前,最好是对Kivy的UI系统有一个基本的了解. 按照惯例,我们先上代码,然后再对代码进行解释: focustest.py import kivy kivy.require('1.8.0') from kivy.app import App from kivy.properties import StringProperty,B

C++ Primer Study Note 系列[1]-chapter1快速入门

I want to study it all the time , and now I am ready to study this book in the next mouth. Time : 2014/07/02 先看一个程序体验一下: #include <iostream> int main() {     /*This is a test example*/     std::cout << "Enter two numbers:" << s

Chapter3——进入Android Dalvik虚拟机

虽然Android平台使用Java来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的. 可能是出于效率和版权的考虑,Google为Android专门设计了一套虚拟机Dalvik Virtual Machine. 上面是第三章的前言,一年多以前,作者写这本书的时候,Kitkat(Android 4.4)还没有出来,作者也声明这本书默认使用的是Android4.1和Linux3.4的环境. 而4.4版本的Android的「开发者选项」中已经添加了Art模式和Dalvik模式切换的

Chapter1 Making a Web Server

a Chapter1 Making a Web Server,布布扣,bubuko.com

C#入门经典 Chapter3 变量和表达式

3.1 C#基本语法 分号结束语句 花括号字符不需要附带分号 缩进     注释:/*....*/,//,/// 区分大小写 3.2 C#控制台应用程序的基本结构 namespace Chapter3 { using System; public class Program { static void Main(string[] args) { int[] factor = new int[4]; bool isRightInt; int i = 0; do { try { Console.Wr