作者Tiberius (渴望平凡的幸福)
看板Python
标题[推荐] 让 pygame 支援「全萤幕下」中文输入/设定输入法显示位置!
时间Wed Feb 7 22:23:15 2007
其实是小弟自己做的东西啦 ^^;
pygame [
http://www.pygame.org/] 是个把 SDL [
http://www.libsdl.org/] 包起来,
让 Python 轻快实验、写游戏的好东西 (正如其名 XD )
但先前有个不太方便的地方,那就是「完全不支援 IME」
也就是说「没办法输入中文、日文」 ...
但是 Jserv 与 dr.courage 做了 SDL-IM [
http://sdl-im.csie.net/] 这个好东西
直接从 SDL 底层支援「跨平台」 IME 机制
使得在 pygame 里面输入中文不再是个梦想!感谢这两位强者的贡献 ;)
由於小弟最近想写一点东西,实在不想等姗姗来迟的 pygame 1.8
因此直接编译 SDL-IM 修改过的 SDL 版本
接着修改 pygame 1.7.1 版加上新的 IME 相关功能,顺便配合 Python 2.5 编译
这样就不必为了写东西而同时安装 Python 2.4/2.5 了 ;)
若您想自己编译 SDL 1.2.8 的话
要小心最新版的 SDL_image/mixer/ttf 可能会没办法配合 SDL 1.2.8 的旧介面
这边使用的是 SDL_image-1.2.4, SDL_mixer-1.2.6 与 SDL_ttf-2.0.8。
下面是给 Python 2.5 用的 pygame 与 Numeric 安装档,内含所有相依档案:
http://mail.cs.nchu.edu.tw/~s9256043/Numeric-24.2.win32-py2.5.exe
http://mail.cs.nchu.edu.tw/~s9256043/pygame-1.7.1release.win32-py2.5.exe
Numeric 是 pygame 快速 surfarray 不可或缺的帮手
没了它,要玩高速绘图就会变得很有难度了
所以也一起帮 Python 2.5 做了一份安装档。
这份 pygame 里面用的 freetype 有把 bytecode interpreter 打开
所以有授权考量的人请自行回避 :p
另外 SDL_ttf 也在载入 glyph 的地方加了忽视全域宽度的选项
如此在应用「某些现成字型」的时候会比较快乐一点 ;)
以下是 pygame 的 patch 档以及增改的 API 部分:
http://mail.cs.nchu.edu.tw/~s9256043/pygame-1.7.1-sdl_im.diff
> pygame.font.Font(filename, size, index=0): return Font
> pygame.font.Font(object, size, index=0): return Font
就是把 SDL_ttf 原本就有的 index 放出来而已,这个引数的用途有两个。
第一个是在使用 .ttc 字型的时候指定要用集合内的哪个字型
比如说在打开 mingliu.ttc 的时候
指定 0 会拿到定宽的细明体
指定 1 会拿到比例间距的新细明体。
第二个是在使用 .fon 字型的时候会拿到哪种点阵图
比如说在使用 Dina prgoramming font [
http://0rz.tw/972mS] 的时候
0~3 分别对应 8 点大小的标准、斜体、粗体、粗斜体
4~7 分别对应 9 点大小的标准、斜体、粗体、粗斜体等等。
> python.event.set_im_flip(bool)
> python.event.get_im_flip()
> python.event.set_im_pos(pos)
这三个就是 IME 的重头戏了!
呼叫 set_im_flip(1) 之後
IME 组字视窗在 pygame SDL 主视窗描绘完之後会跟着重绘一次
显示在 pygame SDL 主视窗上面!
同时用 set_im_pos() 可指定 IME 组字视窗「左上角」在 pygame SDL 视窗内的相对位置
get_im_flip() 当然是取得目前重绘状态的时候用的。
从输入法收到的资料则如下图所示:
http://mail.cs.nchu.edu.tw/~s9256043/070207-zhinput.png
中间有许多 key = 0、unicode 没内容的 KeyDown 事件
这些是被 IME 处理掉的按键;
输入完成之後则有一个 key = 0、unicode 是组字结果的 keyDown 事件
(那边显示的码是「中文输入」)。
值得注意的是切换 IME 的组合键 (ctrl+space 按下放开)、
输入完毕之後的输入键 (之後紧接的 key = 13, unicode = u'\r')
要自己想办法处理掉。
下面这是改好的 eventlist.py 测试档,全萤幕模式并支援输入法
输入法组字视窗会跟着滑鼠游标移动:
http://mail.cs.nchu.edu.tw/~s9256043/eventlist.py
您可以输入一段文字但不确认 (按下 Enter),然後在这个状态下移动滑鼠试试看 ... ;)
==
最後还是要感谢 SDL-IM 的作者!小弟来去写「原本想写的东西」了 ... (嘿嘿)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.126.44.151
1F:推 yoco315:好厉害 @@" 10/28 06:12