limodou的学习记录
limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source ...

导航

Blog统计
  • 文章 - 927
  • 收藏 - 0
  • 评论 - 2911
  • Trackbacks - 16
公告

文章

收藏

    相册

      DocBook

      python

      Pythoner in 中国

      Python开源项目

      技术

      其它

      我的东东

      我的开源项目

      存档


      正在读取评论……
       

      EasyGuider

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

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

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

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

        本次更新为:

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

      • [EasyGuider]增加对Yaml数据存储格式的支持

        大家有兴趣可以下载最新的 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的包,不知道哪个更好一些,有时间再找一找。

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

      • [EasyGuider]快速生成菜单和工具条

        在上一篇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为'-'将生成一个坚线。

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

      • [EasyGuider]使用EasyGuider来生成wxPython代码框架 看到现在越来越多的人想要学习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 显示用法。

        有兴趣可以试一试。以后可以不断扩展这个模板,可以自动生成复杂的程序。而且照猫画虎还可以生成其它的代码框架。
      • [EasyGuider]教程(2) - 在你的应用中嵌入EasyGuider

        嵌入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]教程(1) - 从Hello, EasyGuider开始

        概述

        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

      第1页,共1页