From be4b4641b8d684844dd63f54d55df35e02353c03 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 17 Mar 2021 12:01:37 +0800 Subject: [PATCH] bugfix --- README.md | 11 ++- docs/cn/.binds.md.swp | Bin 0 -> 16384 bytes docs/cn/binds.md | 168 +++++++++++++++++++++++++++++++++++++ docs/cn/cdf.md | 23 +++++ docs/cn/index.md | 9 ++ docs/cn/intro.md | 2 + docs/{blocks => en}/box.md | 0 7 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 docs/cn/.binds.md.swp create mode 100644 docs/cn/binds.md create mode 100644 docs/cn/cdf.md create mode 100644 docs/cn/index.md create mode 100644 docs/cn/intro.md rename docs/{blocks => en}/box.md (100%) diff --git a/README.md b/README.md index 890b5fb..8cd5ac2 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ The Customized json data has it own format to descript the UI and it's interacti pip install git+https://github.com/yumoqing/kivy-blocks ``` Use above command to install the newest version of kivyblocks -the widget specification file ## How to use see the simple example below: ``` @@ -76,3 +75,13 @@ if __name__ == '__main__': if you running it on window, it will show the following: ![hello](./docs/imgs/hello_window.png) +## Documents +[中文文档](./docs/cn/index.md) +[English](./docs/en/index.md) + +## references + +Build app for android please see [Buildozer](https://github.com/kivy/buildozer) +kivy introduct and API please see [kivy](https://kivy.org) + + diff --git a/docs/cn/.binds.md.swp b/docs/cn/.binds.md.swp new file mode 100644 index 0000000000000000000000000000000000000000..943231faaafc4e22fd47c1f25e583427f7d32679 GIT binary patch literal 16384 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 X$9hT=!(bHEpbvY)92-;T2c>@lsUFg` literal 0 HcmV?d00001 diff --git a/docs/cn/binds.md b/docs/cn/binds.md new file mode 100644 index 0000000..2c08756 --- /dev/null +++ b/docs/cn/binds.md @@ -0,0 +1,168 @@ +# 事件绑定 +在构件数据格式文件中可以用”binds“属性来为构件定义一到多个事件绑定。 + +事件绑定是一个数组结构的数据,每个事件绑定为当前构件(及其下属命名子构件)的任何一个事件定义处理实体 + +一个处理实体可以是 +1. 一个构件的方法 +2. 一个”urlwidget“类型的构件 +3. 一个描述一个构件的构件数据 +4. 一个注册函数 +5. 一个python脚本 +6. 某个构件的事件 +7. 一个组合处理(可以是上述处理实体的组合数组) + +## 名称约定 + +* self 当前构件 + +* root App.root构件 + +* “-”(减号)开始的名称,从当前位置查找命名的祖先构件,如果到app.root还没有找到,则返回空 + +* app App.get_running_app + +## 事件绑定数据格式说明 + +### wid + 事件发生所在构件,如果wid所代表的构件不存在指定的事件,此事件绑定将作废, + 必选项,self为当前构件 + +### event + 事件名称,wid和event组合就可以唯一确定一个事件 + +### actiontype + 行动类型,分别是“blocks”、”urlwidget“、“registerfunction”,“script”、“method“、”event“和”multiple“之一。 + +* ”blocks“:值必须是一个符合构件数据格式要求的字典数据,用来创建一个构件。 + +* ”urlwidget“;值必须是一个url,从服务器下载一个构件数据格式的文件来创建构件 + +* ”Registerfunction“:注册函数,注册函数必须是def f(*args, **kwargs)参数格式,args[0] 为wid所代表的构件对象,如果事件带数据,则从args[1]开始。 + +* ”script“:python 脚本。在脚本中有两个内定变量可用: self为“target”指定的构件,args=[事件对象,s事件数据] + +* ”method“:构件的方法,构件由此事件绑定的”target“属性指定,此方法必须具有*args, **kwargs格式的参数定义方式 + +* ”event“:构件的事件,构件由此事件绑定的”target“属性指定,事件绑定的参数将传递给此事件 + +* “multiple”:组合绑定,参看例子 + +### datatarget + 指定数据获取的构件,此构件需有“getValue”方法,用来获取数据,数据需是字典类型 + +### target + 指定处理事件的构件,对于actiontype in ["blocks", "urlwidget"]的事件绑定, target为其父构件,缺省的插入方式为替代,即用事件构造的构件,替换所有target构件中的其他子构件,成为target构件的唯一子构件,可以在事件绑定定义了不等于”replace“的“mode“属性,使得新创建的构件添加在其他构件的后面。 + +### mode + 可选属性,只有在actiontype in ["blocks", "urlwidget"]情况下有效,指定事件创建的构件在target构件中的插入方式,mode==”replace“时,清空target的所有子构件后插入,否则添加到最后。 + +### params + 事件处理指定的静态参数,其值在构件创建时确定,不会改变,实际传递给事件处理的参数为params.update(d), 其中d为datatarget构件的getValue方法返回的结果。如果未定义datatarget,则d={}, + +### options + 可选项,只有在actiontype in ["blocks", "urlwidget"]情况下有效,指定创建构件的构件数据格式options的值需是一个数据字典,且需满足构件数据格式要求。参看[构件数据格式](./cdf.md) + +### conform + 可选项,如果存在,此事件处理前需要客户点击弹出窗体中的确认键,否则将不会处理 + conform的数据格式如下: +``` +"conform":{ + "size_hint":[0.6,0.6], + "title":"Conform for delete playlist", + "message":"Please conform to delete this play list" +} + +``` +其中 + * size_hint定义弹出窗体占屏幕宽,高的占比 + + * title是团出窗体的标题 + + * message是显示的内容 + +### rfname + 当actiontype==‘registedfunction’时有效,指定注册函数,在前端应用中需先注册, 使用以下代码注册一个registedfunction +``` +from appPublic.registerfunction import RegisterFunction + +def HelloRF(*args, **kwargs): + print('Hello ...') + +rf = RegisterFunciton() +rf.register('testrf', HelloRF) +``` +'testrf'即可用于rfname + +### script + 当actiontype=='script'时有效,其值是一行可执行的python代码 + +### dispatch_event + 当actiontype=='event'时有效,指定需要触发target构件上的事件名称 + + +## 例子 + +### urlwidget +``` + { + "actiontype":"urlwidget", + "wid":"delete", + "datawidget":"delete", + "target":"root.public_popup", + "event":"on_press", + "conform":{ + "size_hint":[0.6,0.6], + "title":"Conform for delete playlist", + "message":"Please conform to delete this play list" + }, + "options":{ + "method":"GET", + "mode":"replace", + "params":{{json.dumps(params_kw)}}, + "url":"{{entire_url('delete_pldetail_song.dspy')}}" + } + }, +``` +命名构件”delete“按钮的”on_press"事件被绑定到了一个“urlwidget”事件处理上,数据来源为“delete”构件, 目标窗体为app.root构件下面的一个”public_popup"的构件。此事件的处理需要用户在弹出窗体中点击确认键后才能处理。 + +### method +``` + { + "event":"on_press", + "actiontype":"method", + "wid":"delete", + "target":"root.public_popup", + "method":"open" + } +``` +命名构件“delete”的“on_press"事件调用app.root的public_popup构件的open函数来处理。 + +### registedfunction +``` + { + "actiontype":"registedfunction", + "wid":"playlist_add", + "event":"on_submit", + "datawidget":"playlist_add", + "target":"self", + "rfname":"playlist_add" + } +``` +"playlist_add"构件的"on_submit"事件绑定在一个registedfunction的处理函数上 +事件的数据来源与“playlist_add"构件。 + +### script +``` + { + "actiontype":"script", + "wid":"playlist_add", + "event":"on_submit", + "datawidget":"playlist_add", + "target":"self", + "script":"print(self, args)" + } +``` +"playlist_add"构件的"on_submit"事件绑定了一个script的处理,即打印出target和参数 + + diff --git a/docs/cn/cdf.md b/docs/cn/cdf.md new file mode 100644 index 0000000..e2f3574 --- /dev/null +++ b/docs/cn/cdf.md @@ -0,0 +1,23 @@ +# 构件数据格式说明 +一个构件数据格式必须是一个符合python的字典数据类型,需要至少包含以下属性 + +## id + 定义一个构件的名称,含有此属性的构件为命名构件,命名构件可以通过Blocks.getWidgetById获得。 + 名称规则:名称由字母数字构成,理论上可以包含汉字,绝对不能包含”."(英文句号) + +## widgettype + 定义构件的名称,大部分常用的kivy的widget的类名都可以用,以及kivyblocks扩展的部件 + +## options + 类构建时的参数,字典数据类型 + +## subwidgets + 子构件数组,数组中的每个元素也必须是一个符合构件数据格式要求的数据字典,用于定义一个子构件。 + +## binds + 构件的事件绑定列表,每个构件(和其命名子构件)的任和事件都可以绑定一道多个处理,详细事件绑定请看[事件绑定](./binds.md) + +## 其他属性 + 非上述属性的其他的字典属性,blocks会试图用此属性值来创建构件,如果成功,则将此构件在当前构件中保存为此属性名称,并可用使用属性名称当变量来调用 Blocks.getWidgetById()函数来获取 + + diff --git a/docs/cn/index.md b/docs/cn/index.md new file mode 100644 index 0000000..cec1061 --- /dev/null +++ b/docs/cn/index.md @@ -0,0 +1,9 @@ +# kivyblocks中文文档 + +## 目录 +[kivyblocks简介](./intro.md) + +[构件数据格式说明](./cdf.md) + +[常用构件](./components.md) + diff --git a/docs/cn/intro.md b/docs/cn/intro.md new file mode 100644 index 0000000..8bc4a9f --- /dev/null +++ b/docs/cn/intro.md @@ -0,0 +1,2 @@ +# kivyblocks简介 + diff --git a/docs/blocks/box.md b/docs/en/box.md similarity index 100% rename from docs/blocks/box.md rename to docs/en/box.md