解决Kivy页面输入框无法显示Windows输入法的问题,Kivy已经是最好的了——至少它有自己的页面布局语法,这样每个控件就不用自己用代码新建,而且还可以做出更现代的页面样式。当然,作为一个不太活跃和雄心勃勃的开源产品,Kivy也有很多漏洞。除其他外,中文支持很弱。如果要在界面上显示中文,需要做以下几件事:找一个中文字体放到项目中,比如这个Android标准黑体(提取码:b3sr)就是指这个字体(相对路径)在kv文件中,并且每个Each控件都必须被引用——当然,你可以使用自定义控件来减少引用的次数。例如::font_name:'DroidSansFallback'color:0.18,0.18,0.18,1text_size:self.width,self.height但是这样只解决了显示问题,还有输入问题,TextInput控件确实可以输入中文了,但是输入法的选词框是隐藏的。一般情况下,如果激活了输入法,应该是这样的:然而Kivy的Input是这样的:输入完成后,字也能显示出来,可谁能瞎呢?!!为此,我翻遍了google,包括中文和英文搜索,只找到几句“这个问题是SDL引起的,需要修改源码,重新编译sdl2.dll”。什么?这也太敷衍了吧!于是google+试了半天,终于在win7+VS2012环境下成功编译SDL源码(详见另一篇文章《从源码编译sdl2.dll》)。但是改源码的地方和网上说的不一样:打开工程中的“SDL_windowskeyboard.c”文件,找到开头的“#ifndefSDL_DISABLE_WINDOWS_IME”这句话,在前面加上“#defineSDL_DISABLE_WINDOWS_IME”的,并强制定义这个宏,然后编译它没有任何问题。(源码中多次引用此宏定义使编译分支选择)#include"../../SDL_internal.h"#ifSDL_VIDEO_DRIVER_WINDOWS#include"SDL_windowsvideo.h"#include"../../events/SDL_keyboard_c.h"#include"../../events/scancodes_windows.h"#include#include/*这里定义一个宏,强制显示输入法选择框*/#定义SDL_DISABLE_WINDOWS_IME#ifndefSDL_DISABLE_WINDOWS_IMEstaticvoidIME_Init(SDL_VideoData*videodata,HWNDhwnd);staticvoidIME_Enable(SDL_VideoData*videodata,HWNDhwnd);staticvoidIME_Disable(SDL_VideoData*videodata,HWNDhwnd);staticvoidIME_Quito;end_data*!SDL_INDISABLEI#ifndefmapVk_vk_vk_vk_tsc#定义mapvk_vk_vk_to_vsc0#endif#ifndefmapvk_vk_vk_vk_vo_vo_vk#definemapvks_vks_vo_vk_vo_vk1#endif#ifndef_vk_vk_vk_to_char#definemapvk_var#definemapvk_vk_toysceyscey/”,不是说“禁用Windows输入法d",定义后如何显示?最终的结果并不完美——虽然输入法选择框是有的,但不能自动定位到TextInput控件下,但至少是可用的。