2005年07月31日

在开发 EasyWizard 的过程中,我使用pickle格式来存储信息。但pickle的格式没法看,因此我开发了一个简单的将对象保存为ini格式的小程序(详情参见《 类ini形式的对象序列化模块 》)。因此我想在EasyWizard 中使用它,但是发现有问题。因为obj2ini是处理类实例的,而EasyWizard返回的是一个字典,因此obj2ini是无法正确处理的。为此我做了改进,程序参见

主要改动程序中已经有所说明。

2005年07月30日

今天参加了CPUG/BPUG(中国Python用户组和北京Python用户组)成立大会,不过头一次经验有所不足,有些准备条件并不充分,以致有些人在网上没有参加到。

会议基本上按议事日程进行,不过从我开始就是超时,到最后一共超时两小时。

整个会议由ZoomQuiet主持。由我开始作《CPUG的建议与发展》的发言。然后由QiangNingHong作《 邮件列表的规范和礼节:创造良性发展的交流空间 》的发言。接着由CZug站长潘俊勇作《Zope和Plone的发展现状》的发言。然后是讨论CPUG的定位、作用与近期发展目标,同时讨论了CPUG和以后各地的PUG之间的关系。对于近期的发展计划是决定目前先要进行资源的整合,特别是门户的建立。组织相应的管理小组:

  • WEB维护组(主要完成门户的需求与相关功能的开发,将与CZug合作)
  • 内容维护组(主要完成日常内容的审批、管理)
  • 技术促进组(主要完成新技术的推广)

因为时间不够用,有些议题将继续讨论和完善。下面是一些照片:

 上面人员从左到右分两排写,有些我不记得的以"空缺"表示,希望自行添加。

还有一些人未到,一些人到了但因有事提前走了。 记性不好,大家别怪我。

我还拍了一段小短片

2005年07月26日

jython 2.2 已经出来了,希望在项目中使用它。下载完了,找到一个安装说明,很简单: 

java -jar jython_Release_2_2alpha1.jar

但不幸的是,报错了。错误信息如下:

org.python.util.install.InstallerException: Error accessing jar file
        at org.python.util.install.JarInfo.<init>(JarInfo.java:39)
        at org.python.util.install.Installation.main(Installation.java:46)
Caused by: sun.io.MalformedInputException
        at sun.io.ByteToCharGB18030.convert(Unknown Source)
        at sun.nio.cs.StreamDecoder$ConverterSD.convertInto(Unknown Source)
        at sun.nio.cs.StreamDecoder$ConverterSD.implRead(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at java.io.InputStreamReader.read(Unknown Source)
        at java.io.BufferedReader.fill(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at org.python.util.install.JarInfo.readLicense(JarInfo.java:141)
        at org.python.util.install.JarInfo.readJarInfo(JarInfo.java:125)
        at org.python.util.install.JarInfo.<init>(JarInfo.java:37)
        … 1 more

怎么回事,编码的问题?在网上查了一下,关于ByteToCharGB18030的结果才两页看了半天没有解决办法。试了试加-Dfile.encoding=GBK,没用。不过随便学了一下车东关于编码的文章《Hello Unicode》,知道了如何查看系统属性。不过没用,解决不了问题。想重新编译,需要的工具太多了。最后来想使用2.1版得了。但最后我做了一个决定,先下载最新的Java SDK试试吧。因为我装的是1.4.2_03。结果上到Sun网站一看,都1.4.2_08(不想用1.5)了,于是下吧。下了几十M,安装完毕后。再一试,怎么着,成功了。

唉,前面半天都是费话,要用东西要用新版本呀。这是我从这里得到的教训。这一天过的,快下班才搞定。不过也算是了了一件大事。下面要开始学习使用Jython访问数据库了。

2005年07月24日

功能没有太多的增加,主要是一些快捷键。修改了不少Bug,稳定性提高了一些。还有启动时增加了一个Splash图片,让你不要太心急。

 新增:

  1. 增加行注释和反注释的快捷键(Ctrl+/增加注释 Ctrl+\取消注释)
  2. 增加导入指定模块文件的功能,选中一个字符串,按F6可以导入字符串所表示的模块文件
  3. 启动时编辑窗口的文件延迟打开
  4. 增加设置解释器功能,可以在运行时执行要使用的解释器,同时可以设置是否使用输入输出重定向
  5. 增加执行程序时,自动切换到程序所在的目录功能
  6. 增加记录上次打开路径的功能
  7. 增加中文目录的支持
  8. 增加关闭当前文档快捷键 Ctrl+F4
  9. 增加对导入mixins的异常保护

修改:

  1. 修改FTP中上传文件文本文件未转换错
  2. 修正生成插件目录__init__.py文件的错误
  3. 修正未给frame.workpath赋值的错误
  4. 调整 NewEdit 的应用结构。
  5. Find窗口按ESC可以关闭
  6. 在NewEdit中执行程序时,不进行输入输出重定向时采用异步执行
  7. DDE支持使用CallAfter处理
  8. 修正当选中文本时,按回车不清除文本的bug
  9. 修正执行外部菜单时使用os.startfile()
  10. 修正当snippet不存在时创建路径的处理
  11. 修正取系统缺省编码的处理
  12. 修正代码片段窗口按钮状态处理不正确错误
  13. 修正自动完成中,从文本取出匹配串排序不正确的Bug
  14. 修改在读取缺省编码有误时,使用utf-8编码
  15. 修正改变语法颜色后,文档不更新的Bug。在colourize中增加force参数,当它为True时强制执行。
  16. 修改当在一件空文档上打开文件时,不能正确处理文件类型切换的处理
  17. 修改当自动保存文档时,不能正确保存unicode编码的问题。但对于其它的象ftp的文件保存可能有问题。
  18. 修改对象比较处理,增加__eq__, __ne__方法
  19. 修改当找不到文件对应的语法器时,缺省使用option中的语法器设置的处理,改为缺省使用text语法器
  20. 修改语法高亮的处理,当语言类型未变时不再进行语法高亮处理
  21. 修改ftp list的分析处理
  22. 修改全部保存、全部关闭时不对未打开文档进行处理

积累了很长时间才会有这么多的改动,还有就是把文档修改了一下。

源代码下载
Windows安装程序下载

html2moin.py现在已经更新到0.2版本,修改如下:

  1. 修改页内锚点的处理,将其忽略掉。
  2. 将pre的处理设为python代码,即#!python

下载地址: html2moin_0.2.py

2005年07月23日

早就在学习 django 的教程时知道了 SetupTools 这个工具了(因为在安装时还报了错,因为setuptools的版本问题),不过一直没有机会学习和使用。终于在试着发布 EasyWizard 时用了一下。不过在使用的过程中遇到一些问题,最近也解决了。

EasyWizard 中使用的setup.py脚本如下:

import ez_setup # From http://peak.telecommunity.com/DevCenter/setuptools
ez_setup.use_setuptools()

from SetupTools import setup, find_packages

setup(
    name = "EasyWizard",
    version = "0.1",
    url = ‘http://wiki.woodpecker.org.cn/moin.cgi/EasyWizard/’,
    author = ‘limodou’,
    author_email = ‘limodou@gmail.com’,
    description = ‘A easy way to create Wizard in wxPython‘,
    license = ‘GPL’,
    packages = find_packages(),
    package_data ={
        ‘test’: ['*.jpg'],
    },
    scripts = ['EasyAdmin.py'],
)

前两行

import ez_setup # From http://peak.telecommunity.com/DevCenter/setuptools
ez_setup.use_setuptools()

是为了当setuptools不存在时,有了这两个会自动从网上安装所需要的setuptools包。

后面就是安装脚本了。大部分没什么解释的。其中

packages = find_packages(),

会自动查找当前目录下的所有模块。因此只要把setup.py放在你要打包的模块之上即可由find_packages自动来查找要打包的模块。package_data是用来包括应用所用到的其它数据文件。scripts是可以将脚本拷贝到 Python 的Scripts目录下。因此在你安装 EasyWizard 时,EasyAdmin.py 会自动安装到 Python/Scripts 目录下,因此就可以方便地执行 EasyAdmin.py 了。

那么我遇到什么问题呢?就是某些不在模块中的文件,还有上面*.jpg文件并未打进包里去,试来试去都不得其解。可是我在 SetupTools 文档中看到这么一句话:

setuptools enhances the distutils’ default algorithm for source file selection, so that all files managed by CVS or SubVersion in your project tree are included in any source distribution you build. This is a big improvement over having to manually write a MANIFEST.in file and try to keep it in sync with your project. So, if you are using CVS or SubVersion, and your source distributions only need to include files that you’re tracking in revision control, don’t create a a MANIFEST.in file for your project. (And, if you already have one, you might consider deleting it the next time you would otherwise have to change it.)

于是我启动了SubVersion来将我的EasyWizard设置进去(以前没加进去)。这下都解决了,我想要的文件都加进去了,而且连ez_setup.py,README.txt也自动加到包里去了。原来如此。

只不过现在安装时会生成一个.egg文件(就是一个压缩文件),而不是生成一个目录,我现在还知道如何改掉。

不过使用这个工具的确有趣。与之相配套的还有一个easy_install,它可以自动下载包。不过这个SetupTools也可以设置相关的包和版本,如果没有安装的话会自动下载并安装。

EasyWizard是我这几天搞的一个小项目,它的作用就是帮助你使用 wxPython 来方便地生成Wizard界面,那么它附属的一些类你就可以使用了,象EasyDialog之类的。为什么要搞这个东西,原因有几点:

  1. 将要用在我的项目中
  2. 可以加快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的功能,因为现在没有文档,甚至程序注释都很少。

  1. 以一个字典的方式生成一个Wizard页面的配置信息
  2. 根据这个配置信息可以一次生成多页的Wizard
  3. 现在支持的配置项数据类型有:

    int 整数(IntCtrl或SpinCtrl)
    string 文本(TextCtrl)
    lines 多行文本(TextCtrl)
    float 浮点数(EasyFloat)
    bool 布尔(CheckBox)
    choice 选择(ComboBox)
    static静态文本(StaticText)
    list列表(ListView)
  4. list是一个特殊配置项,它还可以支持如上的配置项包括list,因此可以定义多层(我只试过2层)这样可以生成分级型式的数据。这样与 Meteor 中的数据循环就对应的。
    list控制本身提供增加、删除、修改的功能。
  5. 提供一个命令行工具(EasyAdmin.py),可以对你写出的Wizard直接运行,可以看效果
  6. 生成的结果按照分级的情况为一个字典

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

此项目的说明已经放在了 wookpecker 上,有兴趣可以关注。访问这里。其中测试使用的配置信息没有放在这里,因为发布文本中不能带大括号,可以去wiki中去看。

放几个测试的截屏:

命令行下运行

第一个页面

 第二个页面,背景图变了

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

2005年07月21日

CPUG/BPUG成立大会预计在2005-07-30日召开成立大会。本次大会是在Python中文邮件列表中的广大爱好者的积极努力下准备召开的。关于活动的记录请关注:  http:// wiki.woodpecker.org.cn/moin /BPUG/2005-07-30

会议暂定主题为:

  1. 宣布 CPUG + BPUG 民间Python 推广社团成立
  2. 讨论CPUG 的组织,目标,近期计划
  3. 讨论BPUG 的组织,目标,近期计划
  4. 上海润普,CZUG 站长 panjubyong 的Plone 畅想

会议要达到的目的为:

  1. CPUG+BPUG 核心管理团队
  2. CPUG 门户规划方案

如果你对此感兴趣可以加入邮件列表关注并参与讨论,任何意见都是欢迎的。如何订阅参见:http://wiki.woodpecker.org.cn/moin/PythonCN/FAQ

2005年07月18日

这是在一个国外的blog中看到的,现在已经有2.2alpha1版发布了,可以在sf.net上下载。点击下载

那么这次升级主要有:

This release includes many major changes since the last full release:
 
  – new-style classes
  – Java Collections integration
  – PEP 302 implementation
  – iterators
  – generators
  – __future__ division
  – support for running on JDK1.5
  – new installer
  – a significant number of features to bring Jython in line with CPython
  – many, many bugfixes
 
 It was compiled a OS X with JDK1.4 but should run on JDK 1.2 +.
 
 The full set of changes are too numerous to list in detail.  Please consult
 the sourceforge tracker for all closed issues since the last release.
 
 This version of Jython has support for most of Python 2.2 and numerous
 features from Python 2.3 and beyond.  A more comprehensive list will be
 forthcoming.

感兴趣的去下载尝尝鲜吧。

2005年07月17日

最近经常在 啄木鸟社区 上编辑moin的文章,主要是因为想致力于 django 的学习,但以前就一直有一个疑惑,如何方便地将 Html 转换为 moin 的格式,ZoomQuiet 做过很多,但我没有问过他,我想大概是手工来转格式。这的确是件麻烦的事。于是我基于 NewEdit ,花了些时间编写了一个用于 NewEdit 上的 Script 插件。Script 插件在 NewEdit 上只是配置的问题,而且随改随生效,非常方便,主要用于对编辑窗口中的文本处理。

先将脚本下载到本地,随便放哪里,但建议放在 NewEdit 的scripts目录下。然后 Tool->Script->Script Manage…,这样会弹出一个对话框,然后就点击 Add 按钮就可以安装这个脚本了。注意一定要将脚本的名字改过来,随便什么都行,比如html2moin。这样当点击确定后,这个脚本就会出现在 Tool->Script 的子菜单下,名字就是你刚才改的名字。

然后使用 NewEdit 打开一个 HTML 文件,再执行上面的 html2moin 菜单,这样就会自动将 html 转为 moin 的格式,结果将显示在 message 窗口中,你只要拷贝出来贴在 wiki 中就行了。

这个程序当然不能保证全部转换的正常,主要可以实现:

  • 支持中文
  • 使用tidy模块对HTML文件进行优化处理
  • 去掉div标签
  • 支持pre标签,自动转为moin的程序块标记,没有添加python的语法定义,需要手工加
  • 支持有序,无序标签
  • 支持hr转为—-
  • 支持h1-h5的标签
  • 图片是直接将url转成文本
  • 将文本中的html实体符转为对应的ascii码
  • 支持斜体和粗体
  • 支持链接转换
  • 可以自动处理在正文中的 Python 特殊的方法(前后带两个下划线的方法)

这个程序只是为了方便使用,并没有经过大规模和严格的测试,也有许多的标签可能不支持。不过修改应该还算容易。它主要是使用了SGMLParser来处理各种感兴趣的标签。

需要条件:

上面tidy是windows下的包。如果有问题你可以自行修改,也可以自行增加功能。如何有可能通知本人最好。