Differences between revisions 1 and 7 (spanning 6 versions)
Revision 1 as of 2005-07-23 08:30:16
Size: 5474
Editor: limodou
Comment:
Revision 7 as of 2005-07-23 09:45:52
Size: 7843
Editor: ZoomQuiet
Comment: 追加反馈子页面
Deletions are marked like this. Additions are marked like this.
Line 5: Line 5:
EasyWizard的作用就是帮助你使用 wxPython 来方便地生成Wizard界面,那么它附属的一些类你就可以使用了,象EasyDialog之类的。为什么要搞这个东西,原因有几点:
= EasyWizard项目 =
== 概述 ==
EasyWizard的作用就是帮助你使用 wxPython 来方便地生成Wizard界面,那么它附属的一些类你就可以使用了,象EasyDialog之类的。

== 背景 ==
为什么要搞这个东西,原因有几点:
Line 10: Line 16:
== 详细说明 ==
Line 18: Line 25:
== 功能介绍 ==
Line 39: Line 47:
== 截图 ==
这是测试用的配置信息
{{{#!python
#coding=cp936
page1_elements = [
    ('int', 'numbername', '0', u'数字测试', None),
    ('bool', 'checkname', '0', u'检查框测试', None),
    ('choice', 'choicename', 'Y', u'选择测试', [(u'是', 'Y'), (u'否', 'N')]),
    ('string', 'textname', u'这是一个简单文本', u'简单文本测试', None),
    ('lines', 'multitextname', u'这是一个多行文本', u'多行文本测试', None),
    ('static', 'statictextname', u'这是一个静态文本', u'静态文本测试', None),
    ('float', 'floatname', 12.3, u'浮点数测试', None),
    ]

page2_elements = [
    ('int', 'number', '0', u'数字测试', None),
    ('bool', 'check', '0', u'检查框测试', None),
    ('choice', 'choice', 'Y', u'选择测试', {u'是':'Y', u'否':'N'}),
    ('string', 'text', u'这是一个简单文本', u'简单文本测试', None),
    ('list', 'list', [{'name':'limodou', 'age':31, 'sublist':[]},
        {'name':'zoomquiet', 'age':31, 'sublist':[]}], u'这是一个列表测试', {
        'columns':[('name', 60, 'left'), ('age', 40, 'right'), ('sublist', 50, 'center')],
        'elements':[
            ('string', 'name', 'name', u'姓名', None),
            ('int', 'age', 0, u'年龄', None),
            ('list', 'sublist', [], u'这是子列表测试', {
                'columns':[('X', 60, 'left'), ('Y', 40, 'right'), ('Z', 50, 'center')],
                'elements':[
                    ('string', 'x', 'x', u'X', None),
                    ('choice', 'y', 'A', u'Y', ['A', 'B', 'C']),
                    ('bool', 'z', False, u'Z', None),
                ]
            }),
        ]
    }),
    ]
bitmap = 'logo.jpg'
pagesinfo = [
{'title':u'第一页', 'description':u'第一页描述信息', 'elements':page1_elements},
{'title':u'第二页', 'description':u'第二页描述信息', 'elements':page2_elements, 'bitmap':'logo.png'},
]

}}}
Line 40: Line 91:


attachment:EasyWizard02.jpg

(命令行下运行)

attachment:EasyWizard03.jpg

(第一个页面)

attachment:EasyWizard04.jpg

(第二个页面,背景图变了)

attachment:EasyWizard01.jpg

(list项的增加对话框,其中又有一个list)

= 反馈 =
[[Include(/Discuss)]]

::-- limodou [DateTime(2005-07-23T08:30:16Z)] TableOfContents

EasyWizard项目

概述

EasyWizard的作用就是帮助你使用 wxPython 来方便地生成Wizard界面,那么它附属的一些类你就可以使用了,象EasyDialog之类的。

背景

为什么要搞这个东西,原因有几点:

  • 将要用在我的项目中
  • 可以加快GUI的Dialog的开发,特别是我将用它与 Meteor (流星我的另一个项目,是一个模板系统)相结合,最终可以方便地进行模板处理乃至代码框架的生成。

详细说明

再详细点说:

在我的其它项目中,我发现界面永远是一个让人厌烦和琐碎的工作,特别是对话框,因为你面临的输入值可能各式各样,千差万别。手工写代码也许不麻烦,因为可以拷贝粘贴嘛,但修改维护不方便,我更希望有重用性好的方法。使用象 PyCard 或其它的界面生成器当然也可以,但仍然需要一个个的画,并且可能要写事件处理,取值什么的,复杂点的就不行了。因此我一直都想有一个通用的框架,界面不一定很好看,但一定要方便,灵活,不需要关心生成的细节,我只要关心输入项的输性和结果就可以了,有时哪怕结果不精确也没有关系,因为不是做成商业软件差一些也没什么关系。而且自从开发了Meteor之后(它是一个数据驱动的模板系统,特别适合通过数据类型和结构来控制模板的生成--循环),我也一直想开发一个可以与之相结合的界面工具,它用来得到用户输入数据,再利用Meteor就可以生成一些简单的代码框架,进行模板替换的处理了。

再加上这几天看到了 Django ,更让我感觉到:在大数情况下,我们需要的是功能的快速实现,但如果我们只能使用它重头搭建的话,虽然工具很强,但仍然不方便。如果在强大工具的基础上,再有一套更方便的预装组件,它们应该是为了解决某一问题而定制的,因此存在灵活性与扩展性的问题,但却足以满足目前的快速开发的需求,这样我想会减少我们大量的重复工作。先实现我们的功能,至于不满足的地方可以以后再进行修改。因此这样的工具使用的前提就是,尽量与我们的功能处理分离,以降低可替换成本,同时又要方便使用,以降低学习的成本。图形界面最适合做成这样的工具。Django 在目前看来已经预置了许多功能,因此你花费很少的时间和成本却可以快速搭建一个web应用,同时它足够灵活,你可以一点点地进行替换,或改进Django的功能使之满足你的要求。

EasyWizard目前实现了Wizard页面的快速生成,同时提供了一个方便的EasyDialog的生成。一直就想做,但一直就没想好过。其实在 NewEdit 中已经有现在的一些雏型了:它的配置管理(preference)界面就是通过配置信息自动生成的,可以处理简单的:整数、选择、检查、文本等信息的输入。最近在公司的项目中,我一直使用 Python + wxPython + Sqlite 开发了一个数据交易维护工具,其中有许多的表,它们都需要增加、修改数据记录的功能,如果一个个表来做对话框很麻烦,因此开发了一个根据配置信息自动生成对话框的模块,使用它可以大大简化对话框的处理。这就是我开发EasyWizard的基础,目前已经做了一些简单的测试,需要将功能再考虑详细一些,写一些文档就会对外发布。我希望这个工具可以更加方便今后我在GUI方面的开发,毕竟对于我来说功能够用就行,界面我并不太在行。因此它并不是想替换什么东西,它只是一个特殊需求(快速,简单)的工具而已。这不由得让我想起wax模块。它也是一个基于wxPython的工具库,目的是以更pythonic的方式来生成界面。曾经下载过,但没有使用过,原因就是我无法保证它与以后的wxPython库是兼容的,同时依赖于它的话可能会造成别人也需要安装这个包才可以,为了减少麻烦我没有使用过它。但有时间应该好好向它学一学。

功能介绍

下面我简单地介绍一下EasyWizard的功能,因为现在没有文档,甚至程序注释都很少。

  • 以一个字典的方式生成一个Wizard页面的配置信息
  • 根据这个配置信息可以一次生成多页的Wizard
  • 现在支持的配置项数据类型有:
    • int 整数(IntCtrlSpinCtrl)

    • string 文本(TextCtrl)

    • lines 多行文本(TextCtrl)

    • float 浮点数(EasyFloat)

    • bool 布尔(CheckBox)

    • choice 选择(ComboBox)

    • static静态文本(StaticText)

    • list列表(ListView)

      • list是一个特殊配置项,它还可以支持如上的配置项包括list,因此可以定义多层(我只试过2层)这样可以生成分级型式的数据。这样与 Meteor 中的数据循环就对应的。
    • list控制本身提供增加、删除、修改的功能。
    • 提供一个命令行工具(EasyAdmin.py),可以对你写出的Wizard直接运行,可以看效果

    • 生成的结果按照分级的情况为一个字典

以后还会增加其它一些输入控制项,如:密码、目录、文件等,反正想到什么就加什么。也许以后还会增加一些其它的更方便的界面生成类,如:列表等。

截图

这是测试用的配置信息

   1 #coding=cp936
   2 page1_elements = [
   3     ('int', 'numbername', '0', u'数字测试', None),
   4     ('bool', 'checkname', '0', u'检查框测试', None),
   5     ('choice', 'choicename', 'Y', u'选择测试', [(u'', 'Y'), (u'', 'N')]),
   6     ('string', 'textname', u'这是一个简单文本', u'简单文本测试', None),
   7     ('lines', 'multitextname', u'这是一个多行文本', u'多行文本测试', None),
   8     ('static', 'statictextname', u'这是一个静态文本', u'静态文本测试', None),
   9     ('float', 'floatname', 12.3, u'浮点数测试', None),
  10     ]
  11 
  12 page2_elements = [
  13     ('int', 'number', '0', u'数字测试', None),
  14     ('bool', 'check', '0', u'检查框测试', None),
  15     ('choice', 'choice', 'Y', u'选择测试', {u'':'Y', u'':'N'}),
  16     ('string', 'text', u'这是一个简单文本', u'简单文本测试', None),
  17     ('list', 'list', [{'name':'limodou', 'age':31, 'sublist':[]}, 
  18         {'name':'zoomquiet', 'age':31, 'sublist':[]}], u'这是一个列表测试', {
  19         'columns':[('name', 60, 'left'), ('age', 40, 'right'), ('sublist', 50, 'center')],
  20         'elements':[
  21             ('string', 'name', 'name', u'姓名', None),
  22             ('int', 'age', 0, u'年龄', None),
  23             ('list', 'sublist', [], u'这是子列表测试', {
  24                 'columns':[('X', 60, 'left'), ('Y', 40, 'right'), ('Z', 50, 'center')],
  25                 'elements':[
  26                     ('string', 'x', 'x', u'X', None),
  27                     ('choice', 'y', 'A', u'Y', ['A', 'B', 'C']),
  28                     ('bool', 'z', False, u'Z', None),
  29                 ]
  30             }),
  31         ]
  32     }),
  33     ]
  34 bitmap = 'logo.jpg'
  35 pagesinfo = [
  36 {'title':u'第一页', 'description':u'第一页描述信息', 'elements':page1_elements},
  37 {'title':u'第二页', 'description':u'第二页描述信息', 'elements':page2_elements, 'bitmap':'logo.png'},
  38 ]

截图:

attachment:EasyWizard02.jpg

(命令行下运行)

attachment:EasyWizard03.jpg

(第一个页面)

attachment:EasyWizard04.jpg

(第二个页面,背景图变了)

attachment:EasyWizard01.jpg

(list项的增加对话框,其中又有一个list)

反馈

Include(/Discuss)

EasyWizard (last edited 2009-12-25 07:13:57 by localhost)