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_IMEstatic 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控件上面,不过起码是可用了。