2007年11月25日 星期日 12:52
在我的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就很方便,但一旦要自己从头编译起就很麻烦,往往有些难搞的小问题。
Zeuux © 2025
京ICP备05028076号