From 00446d7500ee50a2d137a7e1fb99fe160d9fb09b Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 16 Mar 2021 11:11:15 +0800 Subject: [PATCH] bugfix --- README.md | 70 ++++++++++++++++++++++++++++++++++--- docs/blocks.md | 47 +++++++++++++++++++++++++ docs/imgs/hello_window.png | Bin 0 -> 14029 bytes kivyblocks/blocksapp.py | 15 ++++---- kivyblocks/i18n.py | 12 ++++--- test/conf/config.json | 15 +------- test/main.py | 33 +++++++++++++++-- 7 files changed, 160 insertions(+), 32 deletions(-) create mode 100644 docs/blocks.md create mode 100644 docs/imgs/hello_window.png diff --git a/README.md b/README.md index 36879b9..a8bed30 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,78 @@ # KivyBlocks -Can you ever image build a gui application like play Lego blocks? kivyblocks it try to provide programmer a tool to build a application +Can you ever image build a gui application like play Lego blocks? kivyblocks just try to provide programmer a tool to build a application like play lego blocks + +kivyblocks base on the python package 'kivy', which is a cross platform GUI package and can play on window, linux, mac OS x, android and iphone ## Requirement + +[appPublic](https://github.com/yumoqing/appPublic) +[kivycalendar](https://github.com/yumoqing/kivycalendar) +[kivy](https://github.com/kivy/kivy) +... see the [requirements.txt]('./requirements.txt') ## Principle -There is a blocksapp(inherited from App) contains a toppage widget to hold all the top widget create by Blocks, and the Blocks can create widgets which is specified in a dictionary data, and a HttpClient to get data or weiget spec file for web server. +There is a BlocksApp(inherited from App) in kivyblocks contains a all widgets can be created by Blocks, and the Blocks creates widgets according a customized json data, the data can download from application server or local filesystem. +The Customized json data has it own format to descript the UI and it's interaction. please see the "Customized json data" section for further information. -the widget specifiction file +## installation +``` +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: ``` -``` +import sys +import os +from appPublic.folderUtils import ProgramPath +from appPublic.jsonConfig import getConfig + +from kivyblocks.blocksapp import BlocksApp +from kivyblocks.blocks import Blocks + +class TestApp(BlocksApp): + def build(self): + b = super(TestApp, self).build() + widget_desc = { + "widgettype":"VBox", + "options":{}, + "subwidgets":[ + { + "widgettype":"Title1", + "options":{ + "text":"Say Hello", + "i18n":True, + "size_hint_y":None, + "height":"py::CSize(2)" + } + }, + { + "widgettype":"Text", + "options":{ + "text":"Hello KivyBlocks" + } + } + ] + } + blocks = Blocks() + x = blocks.widgetBuild(widget_desc) + return x + + +if __name__ == '__main__': + pp = ProgramPath() + workdir = pp + if len(sys.argv) > 1: + workdir = sys.argv[1] + print('ProgramPath=',pp,'workdir=',workdir) + + config = getConfig(workdir,NS={'workdir':workdir,'ProgramPath':pp}) + myapp = TestApp() + myapp.run() +``` +if you running it on window, it will show the following: +![hello](./docs/imgs/hello_window.png) diff --git a/docs/blocks.md b/docs/blocks.md new file mode 100644 index 0000000..0668666 --- /dev/null +++ b/docs/blocks.md @@ -0,0 +1,47 @@ +# Blocks +Blocks是kivyblocks的核心类,负责将字典类型的数据转化为GUI的Widget。 +Blocks也注册到了kivy.factory.Factory中,可以使用 +``` +blocks = Factory.Blocks() +``` +初始化实例 + +## 方法 +### widgetBuild(desc) +#### 参数 +* desc 1) 字典类型, Widget描述的字典数据 + 2) 字符串,可通过json导入的字符串 + +#### 返回值 +成功返回创建的widget实例 +失败返回空 + +#### 事件 +如果创建widget成功,触发”on_built"事件, +如果创建widget失败,将触发“on_failed”事件 + +事件处理函数的例子如下: +创建成功: +``` +def on_built(o, w): + pass +``` +其中,o为Blocks实例, w为新建widget的实例 +创建失败 +``` +def on_failed(o,e): + pass +``` +其中, o为Blocks实例, e为例外实例 + +#### 功能描述 +此方法按照desc字典数据构建一个Widget,首先按照desc['options']中的参数初始化“widgettype”属性指定的类,并将“subwidgets”中的子Widget创建,并添加到Widget中,并且将非“options”,“subwidgets“和”binds“的其他属性也创建完成,并作为Widget的属性变量,最后创建”binds“中的事件处理。 + +widgetBuild按照执行结果的状态,会触发两个事件中的一个,如果创建成功,会触发"on_built" + +### getWidgetById(id, from_widget=None) +查找指定id的widget,可以指定从整个widget树上的哪个节点开始查找。 +#### 参数 +id:字符串,其中‘.'用于分割,节点id,如果id中存在‘.',那么 +## 使用用例 + diff --git a/docs/imgs/hello_window.png b/docs/imgs/hello_window.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce13a8acbc3b3a25899805e3808c1e64d033425 GIT binary patch literal 14029 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