2005年12月14日

此次改名包括EasyGui本身的目录修改,引用修改,同时还包括了 NewEdit 的修改,wiki页面的修改,以前的Blog及分类的修改,及相应的发布包的修改。同时创建了新的 google 讨论组。以后就再也不与其它的项目重名了。ZoomQuiet 帮我做了大量的工作,表示感谢。

2005年11月17日

希望使用 NewEdit 来生成 django 的model代码,于是正在使用 EasyGuider 来生成界面。而 django 中每个字段的选项很多,我希望生成的代码是:如果选项没有选中,则不生成相应的代码。而 EasyGuider 中没有对每个控件还可以指定是否使用的功能,因此上对此进行了改造。现在可以在每个控件前选择增加是否需要一个CheckBox,当它选中时,对应的控件才可以进行编辑,并且可以输出结果。如果没有选中,则对应的控件是不能编辑的,并且不输出结果。这样在 NewEdit 中使用时就方便多了。

而 NewEdit 中对于 Django 的插件正在完善了,很快可以出一个可以输助生成 model 代码的插件。这样 django 插件相对完整。再往后就是如何辅助录入的问题了。

如果你要单独使用 EasyGuider ,则可以去它的 wiki 页面下载。

本次更新为:

  • 增加在每个控件前可以增加一个CheckBox 的功能,这样用它来控制是否使用。如果未选中,则对应的控件无法使用,且输出不再这个结果。如果选中才可以处理并返回结果。对于资源文件的改变就是如果要使用,可以在每个element前加上True或False。True表示创建时即为选中,False为未选中,同时控件也被禁止。
  • 同时将日志功能关闭。感觉到处生成日志的确很讨厌。
  • 增加了一个testChTmp.py的资源文件用来测试CheckBox功能。

2005年08月24日

大家有兴趣可以下载最新的 EasyGuider 程序。目前已经支持 Yaml 格式的数据存储了。

另附 Yaml 的简单示例:

>>> a = {’a':1, 11:’b'}
>>> import yaml
>>> yaml.dump(a)
‘—\n11: b\na: 1\n’
>>> b = ‘—\n11: b\na: 1\n’
>>> yaml.load(b).next()
{’a': 1, 11: ‘b’}

那么到这里我有一个疑问,数字与数字类型的字符串如何区分?经测试,数字不加引号。而数字类型的数字要加引号。

不过再仔细测试,发现boolean类型出错。比如True会转换为字符串。因此建议在使用时要小心。

>>> yaml.dumpToFile(file(‘a.yaml’, ‘wb’), a)
>>> yaml.loadFile(‘a.yaml’).next()
{’a': 1, 11: ‘b’}

Python下好象有好几个Yaml的包,不知道哪个更好一些,有时间再找一找。

为了发布文章,我将半角大括号改为了全解,请注意。

2005年08月18日

在上一篇Blog我使用 EasyGuider 生成了一个简单的 wxPython 程序框架,但它非常简单。今天在昨天的基础上增加了菜单和工具条的生成。全部代码和示例模板已经包含在最新的EasyGuider包中了。

操作方式见《使用EasyGuider来生成wxPython代码框架

目前菜单与工具条是写在一个配置文件中,运行时由MainFrame.py来导入。配置文件为:resource.py,内容为

actions = [
   ('ID_FILE', '&File', None, '', 'File', None, None),
   ('ID_FILE_OPEN', '&Open\tCtrl+O', None, 'open', 'Open a file',
'images/blog.gif', None),
   ('ID_FILE_EXIT', 'E&xit\tAlt+F4', None, 'exit', 'Exit the
program', None, 'OnExit'),
   ('ID_EDIT', '&Eile', None, '', 'Eile', None, None),
   ('ID_EDIT_UNDO', '&Undo', None, 'undo', 'Undo last command',
'images/undo.gif', None),
   ('ID_EDIT_REDO', '&Redo', None, 'redo', 'Redo last command',
'images/redo.gif', None),
]

menubar = [
   (None,
       [(100, 'ID_FILE'),
        (110, 'ID_EDIT')]),
   (‘ID_FILE’,
       [(100, 'ID_FILE_OPEN'),
        (110, '-'),
        (120, 'ID_FILE_EXIT')]),
   (‘ID_EDIT’,
       [(100, 'ID_EDIT_UNDO'),
        (110, 'ID_EDIT_REDO')]),
]

toolbar = [
   (100, 'ID_FILE_OPEN'),
   (110, '-'),
   (120, 'ID_EDIT_UNDO'),
   (130, 'ID_EDIT_REDO')
]

actions为最基本的功能集,象Delphi和Qt中都有这样的东西。在这里我借用了这个东西。因为菜单与工具按钮功能很类似,因此为了减少冗余需要先定义action集,然后在它的基础之上生成menubar和toolbar。

一个action的格式为:

  • id 建议大写英文,它将作为引用的键值被menubar和toolbar所使用,当值为’-'时表示分隔线
  • caption 它可以使用标准的菜单的快捷键和加速键的定义方式。
  • type 缺省视为normal,其它可以为check、radio
  • shorttip 短提示,用于工具条
  • longtip 长提示,用于菜单、工具按钮在状态条上的提示
  • image 对应的图像,可以为文件名,image对象或使用img2py生成的函数名
  • funcname 事件方法名,如缺省会自动查找名为以ON开头后面为id的方法

menubar是一个list,由二元tuple构成。每个tuple的第一项是父菜单的id,第二项是一个list,内容为菜单项集合,也是使用二元tuple表示。id为’-’是由系统缺省提供,表示一个分隔线。内容列表中的每个tuple由(order,action_id)构成。order是用于排序。因此菜单的顺序是靠order来排列的,可以随便摆放

toolbar是一个list,由二元tuple构成(order, action_id)。同菜单,order也是用于排序。id为’-’将生成一个坚线。

说明写得很简单,有时间再细化。有兴趣的可以试一试。

2005年08月17日

看到现在越来越多的人想要学习wxPython,但入门是一个问

题,于是我就想可以使用EasyGuider来生成一个wxPython的代码框架,这样方便大家测试和学习。

需要准备:

EasyGuider 模块 http://wiki.woodpecker.org.cn/moin.cgi/EasyGuider
Meteor 模块 http://wiki.woodpecker.org.cn/moin.cgi/Meteor

分别安装后,进行EasyGuider的test子目录,然后在命令行下执行:

EasyAdmin.py -s easyapp.script easyapp.py


按照屏幕录入相应的值,然后finish后就会在相应的目录下生成wxpython的文件。

主文件名为你起的 应用名称.py

因此你的应用名称应该是英文的。

目前生成的代码非常简单,只生成一个窗口,其它什么也没有。但支持命令行参数:-V 显示版本 -u 显示用法。

有兴趣可以试一试。以后可以不断扩展这个模板,可以自动生成复杂的程序。而且照猫画虎还可以生成其它的代码框架。

2005年08月08日

嵌入EasyGuider

上一篇教程演示了如何生成一个对话框,但它是使用EasyAdmin.py来运行的,而我们的需求可能是在自已的GUI程序中使用,如何用呢?

那么就让我们看一看EasyAdmin.py的代码吧:

if __name__ == ‘__main__’:
    from EasyGuider import EasyCommander
    easy = EasyCommander.EasyCommander(inline=False)
    if easy.run():
        print ‘\n——————-values——————’
        print easy.GetValue()

很简单,就这么几行。其实真正的工作都是在EasyCommander中完成的。你可以看到easy就是创建的EasyCommander对象,运行它的run()方法会得到返回值。当返回值为真时,调用easy.GetValue()就可以得到输入的数据了。只要把上面几行代码嵌入到你的应用中就行了。但要注意的是inline参数应改为True

不过这里有一个问题就是:配置文件在哪里输入?

一种方式是:EasyCommander可以自动处理命令行参数,因此你可以在你的命令行参数中指定,-e。

另一种方式是:预先按正确的模块来导入配置文件,然后在调用时传入EasyCommander中。示例分别为:

#file test.py
import wx
from EasyGuider import EasyCommander
import hello

class MainApp(wx.App):
    def OnInit(self):
        self.frame = frame = wx.Frame(None, -1, title="Test Frame")
        self.init()
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

    def init(self):
        sizer = wx.BoxSizer(wx.VERTICAL)

        btn = wx.Button(self.frame, wx.ID_OK, "OK")
        btn.Bind(wx.EVT_BUTTON, self.OnClick)
        sizer.Add(btn, 0, wx.EXPAND)
        self.frame.SetSizer(sizer)
        self.frame.SetAutoLayout(True)
        sizer.Fit(self.frame)

    def OnClick(self, event):
        easy = EasyCommander.EasyCommander(easyfile=hello, inline=True)
        if easy.run():
            print easy.GetValue()['username']
        easy.Destroy()

app = MainApp(0)
app.MainLoop()

这个例子就是将配置文件作为模块导入的例子。要注意:inline=True, easyfile=你导入的配置模块名。

特别要注意释放对象easy.Destroy()。

命令行执行为:

Python test.py

第二种情况代码为:

#file test1.py
import wx
from EasyGuider import EasyCommander
import hello

class MainApp(wx.App):
    def OnInit(self):
        self.frame = frame = wx.Frame(None, -1, title="Test Frame")
        self.init()
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

    def init(self):
        sizer = wx.BoxSizer(wx.VERTICAL)

        btn = wx.Button(self.frame, wx.ID_OK, "OK")
        btn.Bind(wx.EVT_BUTTON, self.OnClick)
        sizer.Add(btn, 0, wx.EXPAND)
        self.frame.SetSizer(sizer)
        self.frame.SetAutoLayout(True)
        sizer.Fit(self.frame)

    def OnClick(self, event):
        easy = EasyCommander.EasyCommander(inline=True)
        if easy.run():
            print easy.GetValue()['username']
        easy.Destroy()

app = MainApp(0)
app.MainLoop()

与第一个差别不大,就是没有输入easyfile=参数。inline也为True。

命令行执行为:

Python test1.py -e hello.py

其实inline值本身为True或False区别不大,只是在命令行处理上有一些区别。

在嵌入EasyGuider时,你的应用本身可以是GUI程序,也可以是命令行程序,没关系,EasyGuider会自动判断是否已经有wxApp对象来自动创建GUI环境,因此适应性很强。但由于它自身有一些命令行选项,因此在处理时要小心。其实最简单的情况下你可以将命令行参数写在配置模块文件中,EasyGuider会自动判断。因此改变EasyGuider的调用参数一是通过命令行,另一种方法就是写在配置模块文件中。

目前可用的置于配置文件中的属性为:

scriptfile 脚本文件名
inipickle obj2ini格式数据文件名
picklefile pickle格式数据文件名
outputfile 模板输出文件名

而配置文件本身一是通过命令行-e参数设置,一是通过导入方式,然后传入到EasyCommander类中。

概述

EasyGuider 是一个快速生成录入界面的工具包,它的快速体现在:

  • 有可用的模型(Dialog, Wizard, Notebook)
  • 内置了丰富的数据录入类型
  • 界面通过配置即可完成
  • 有命令行工具可以进行测试

因为它是一个通用性的录入生成工具包,因此它不可能完成你想要的所有功能,可能在某些地方还更弱,但如果你对界面要求不高,同时不想在录入界面上花费大量的时间,你可以考虑使用 EasyGuider 项目。

EasyGuider 是基于wxPython的。

下载和安装

可以到 http://wiki.woodpecker.org.cn/moin.cgi/EasyGuider 页面上下载,目前版本为0.1测试版。

使用它建议你安装 Python 2.4+ wxPythhon unicode 2.6+,因为我就是在这两个版本下测试的。

下载后解压到一个目录下,在命令行执行:

Python setup.py install

这个安装程序使用了新的 SetupTools 工具制作,因此如果你没有安装,它会自动从网上下载安装。

安装完毕后,EasyAdmin.py程序会安装到python/Scripts目录下,其余的运行库文件将装到Lib/site-packages目录下。如果想在命令行直接运行EasyAdmin.py,则需要将python的Scripts设置到PATH路径中。

如果你很熟悉 Python ,那么这些工具有些可能以前就做过,操作起来很简单,如果你不太熟悉,那么建议你掌握它,因为这些都是标准的 Python 模块的安装步骤,有些比这个还要复杂。

Hello, EasyGuider程序

下面开始我们的第一个对话框程序。EasyGuider内置了对话框生成器。下面我们要实现一个输入用户名的对话框,并使用EasyAdmin.py来运行它。

先建一个配置文件,它就是一个 Python 程序,起名为 hello.py:

#coding=gb2312

title = ‘Hello, EasyGuider’
dialog = [
    ('string', 'username', '', u'请输入用户名', None),
    ]

因为使用了中文,因此加入coding说明。所有中文前都要使用u记号。其中dialog表示它是一个对话框。title为对话框的标题。

写完了,好,可以运行了!奇怪吗?

进入命令行(注意已经把 Python 的 Scripts 路径加进 PATH 中了),执行:

EasyAdmin.py hello.py

界面已经出来了:

回车或点OK,对话框会关闭,在命令行会打出你输入的值来。如:

——————-values——————
{’username’: u’EasyGuider’}

也就是说你最终得到的数据是一个字典。key就是在配置文件中定义的名字,值是你刚才输入的信息。

现在把这行解释一下:

(’string’, ‘username’, ”, u’请输入用户名’, None),

这就是一个配置项,一共有5个域,分别为:

  1. 输入类型 string 表示单行文本
  2. 变量名 即usename
  3. 初始值 此外为空串”
  4. 提示信息 每个输入项一般都有一个提示信息
  5. 扩展域 此输入项不需要,一些其它类型的输入项可能会用到,未用为None