Kivy是Python环境下"著名"的图形界面环境,好吧,实在不怎么著名,但Python下的UI框架都太弱了,相对来说,Kivy已经是最好的——起码有自己的页面布局语法,不至于每个控件都得自己用代码new出来,也可以做出比较有现代感的页面样式。
当然,作为一款不那么活跃,还野心勃勃的开源产品,Kivy的漏洞也是多多,不说别的,光中文支持就弱爆了。要想在界面上显示中文,需要做下面这些事儿:
- 找一个中文字体,放到项目里,比如这个安卓标准黑体 (提取码:b3sr)
- 在kv文件中引用这个字体(相对路径),而且每个控件都要引用——当然,可以用自定义控件减少引用次数。例如:
<LabelTd@Label>:
font_name:'DroidSansFallback'
color: 0.18,0.18,0.18,1
text_size: self.width, self.height
但这只解决了显示问题,还有输入问题,TextInput控件确实可以在输入时显示中文,但却隐藏了输入法的选词框。正常情况下,如果激活了输入法,应该是这样的:
然而Kivy的Input却是这样的:
输入完成后,字也可以显示出来,可盲选谁能做到啊?!!
为此我翻烂了google,包括中英文搜索,也只发现寥寥几句“这个问题是SDL造成的,需要修改源码,重新编译sdl2.dll”。What?这也太敷衍了吧!
于是又google+尝试了很久,终于在win7+VS2012环境下成功编译了SDL源码(详见另一篇“从源码编译 sdl2.dll”)。但是改源码的地方,跟网上说的也不同:
打开项目中“SDL_windowskeyboard.c”这个文件, 找到开头"#ifndef SDL_DISABLE_WINDOWS_IME" 这句, 在它的前面加上"#define SDL_DISABLE_WINDOWS_IME",强行定义这个宏,再编译就没有问题了。(源码里面多处引用这个宏定义,做编译分支选择)
#include "../../SDL_internal.h"
#if SDL_VIDEO_DRIVER_WINDOWS
#include "SDL_windowsvideo.h"
#include "../../events/SDL_keyboard_c.h"
#include "../../events/scancodes_windows.h"
#include <imm.h>
#include <oleauto.h>
/*这里定义一个宏,强行显示输入法选择框*/
#define SDL_DISABLE_WINDOWS_IME
#ifndef SDL_DISABLE_WINDOWS_IME
static void IME_Init(SDL_VideoData *videodata, HWND hwnd);
static void IME_Enable(SDL_VideoData *videodata, HWND hwnd);
static void IME_Disable(SDL_VideoData *videodata, HWND hwnd);
static void IME_Quit(SDL_VideoData *videodata);
#endif /* !SDL_DISABLE_WINDOWS_IME */
#ifndef MAPVK_VK_TO_VSC
#define MAPVK_VK_TO_VSC 0
#endif
#ifndef MAPVK_VSC_TO_VK
#define MAPVK_VSC_TO_VK 1
#endif
#ifndef MAPVK_VK_TO_CHAR
#define MAPVK_VK_TO_CHAR 2
#endif
/* Alphabetic scancodes for PC keyboards */
说实话这个宏的名字挺迷惑的,明明叫"disable_windos_ime",不就是“禁用windows输入法”的意思么,怎么定义以后反而可以显示了呢?
最终的结果不是很完美——输入法选择框虽然有了,但不能自动定位到TextInput控件下面,不过起码是可用了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。