Python论坛  - 讨论区

标题:[python-chinese] [Ulipad]几个Mac兼容性问题:FlatNoteBook、Icon.LoadFile()和locale.getdefaultlocale()

2007年11月25日 星期日 12:52

swordsp sparas2006在gmail.com
星期日 十一月 25 12:52:37 HKT 2007

在我的ibook上跑Eclipse实在太考验耐心,反复数次之后决定还是试试Ulipad。不过一上手就不太顺利,遇到若干Mac的兼容性问题。折腾半个晚上,总算大致有了一些进展。limodou手上大概也没有Mac的环境测试,我就来当小白鼠了:

1. FlatNoteBook的兼容性问题
Ulipad中集成的FlatNoteBook与Mac下高版本的wxPython不兼容,启动时会直接抛出下面的异常:

[Traceback]Traceback (most recent call last):
  File "/Users/swordsp/Develop/workspace/Ulipad/modules/wxctrl/FlatNotebook.py",
line 3587, in OnPaint
    renderer.DrawTabs(self, dc)
  File "/Users/swordsp/Develop/workspace/Ulipad/modules/wxctrl/FlatNotebook.py",
line 2283, in DrawTabs
    mem_dc.Blit(0, 0, rect.width, rect.height, dc, rect.x, rect.y)
  File "//Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/wx-2.8-mac-unicode/wx/_gdi.py",
line 3373, in Blit
    return _gdi_.DC_Blit(*args, **kwargs)
PyAssertionError: C++ assertion "wxAssertFailure" failed at
/BUILD/wxPython-src-2.8.4.2/src/common/dcgraph.cpp(776) in DoBlit():
Cannot Blit. Unable to get contents of DC as bitmap.

大致原因是Mac系统下对显示缓存有特别的操作限制(只写不能读),导致Blit的实现在Mac下无法工作。前两天在wxPython的邮件列表里有人报告了这个bug,原作者Andrea
Gavana已经在svn中修掉了。相关讨论参见下面这个Thread:
http://aspn.activestate.com/ASPN/Mail/Message/wxpython-users/3582970

我直接用最新版本的FlatNoteBook替换掉Ulipad中内置的似乎就可以工作了,不过Ulipad内置的版本比较老,没有仔细的检查是不是引起了其它向后兼容性问题。

既然FlatNoteBook已经正式集成到了wxPython中,是不是可以考虑现在直接使用wxPython中提供的wx.lib.flatnotebook,Ulipad内置的版本可以只作为低版本兼容的备用?这样以后有其它更新的话也可以直接跟进了。

2. Icon.LoadFile()
还是wxPython的平台兼容性问题……在Mac版本中,Icon类根本就没有LoadFile这个方法,于是启动时mixins.Import.init()就会直接抛找不到属性的异常。最开始我还以为是wxPython高版本中的api变动,结果找了台windows机器对比测试才确定只是Mac平台下缺少这个方法。

对wxPython完全不熟,查了一点示例代码尝试改写成这样:
def init(win):
    icon = wx.EmptyIcon()
    iconfile = common.uni_work_file('ulipad.ico')
-    icon.LoadFile(iconfile, wx.BITMAP_TYPE_ICO)
+    image = wx.Image(iconfile, wx.BITMAP_TYPE_ICO)
+    image = image.ConvertToBitmap()
+    icon.CopyFromBitmap(image)
    win.SetIcon(icon)

启动不会报错了,可图标还是wxPython默认的火箭图案。谁知道Mac下怎样的写法能生效么?或者还有什么设置图标的方法?

3. locale.getdefaultlocale()
有几处代码中都有类似这样的写法:
text.encode(locale.getdefaultlocale()[1])
在简体中文版Mac OS X(事实上还包括繁体中文、日文甚至其它语系)的默认设置下会抛出如下异常:
LookupError: unknown encoding: X-MAC-SIMP-CHINESE
(如果是日文系统,default locale就会是X-MAC-JAPANESE,而sys.getdefaultencoding()则是统一返回'ascii')
这对应到apple自己搞得一套编码系统,和windows下的gbk、shift-jis以及utf-8都不一样,目前这几种编码python还没有内建支持(encodings包里没有码表,于是encode、decode就搞不定了,添加alias也不行)。事实上python官方的issue
tracker里最近才有人正式提交了这个bug:
http://bugs.python.org/issue1276
看起来有希望会在python2.6解决的样子,现在要自己绕过去的话大概得要直接在标准库或者site.py里做点手脚了。

不过因为Ulipad其实并不一定要支持这些编码,感觉上只要捕获异常最后落回utf-8就好了(至少我是这么改了)。
考虑到modules.common里其实已经包括了这些处理,我觉得只要把相关逻辑一致化,其它的模块统一从modules.common这里读default
encoding就可以彻底解决了。


此外还有些小地方似乎有问题,还没来得及细看,改天有时间研究研究再来报告好了。

顺便感慨一下,Mac下面有不少好看又好用的原生软件,但那些跨平台软件的表现往往就不尽如人意。
Java、Firefox、wxWidgets、GTK+……都是Mac版本最差,比起Windows版本和Linux版本,让人觉得就仿佛是后娘养的孩子。很多类库也是,如果有Mac的二进制安装包或者Fink/DarwinPorts就很方便,但一旦要自己从头编译起就很麻烦,往往有些难搞的小问题。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号