[推荐] 讓 pygame 支援「全螢幕下」中文輸入/댠…

看板Python作者 (渴望平凡的幸福)時間18年前 (2007/02/07 22:23), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
其實是小弟自己做的東西啦 ^^; 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

10/28 06:12, , 1F
好厲害 @@"
10/28 06:12, 1F
文章代碼(AID): #15oU3KSx (Python)
文章代碼(AID): #15oU3KSx (Python)