【Python】解决Kivy页面输入框无法显示Windows输入法的问题

Kivy是Python环境下"著名"的图形界面环境,好吧,实在不怎么著名,但Python下的UI框架都太弱了,相对来说,Kivy已经是最好的——起码有自己的页面布局语法,不至于每个控件都得自己用代码new出来,也可以做出比较有现代感的页面样式。

当然,作为一款不那么活跃,还野心勃勃的开源产品,Kivy的漏洞也是多多,不说别的,光中文支持就弱爆了。要想在界面上显示中文,需要做下面这些事儿:

  • 找一个中文字体,放到项目里,比如这个安卓标准黑体 (提取码:b3sr)

【Python】解决Kivy页面输入框无法显示Windows输入法的问题

  • 在kv文件中引用这个字体(相对路径),而且每个控件都要引用——当然,可以用自定义控件减少引用次数。例如:

<[email protected]>:

font_name:'DroidSansFallback'

color: 0.18,0.18,0.18,1

text_size: self.width, self.height


但这只解决了显示问题,还有输入问题,TextInput控件确实可以在输入时显示中文,但却隐藏了输入法的选词框。正常情况下,如果激活了输入法,应该是这样的:
【Python】解决Kivy页面输入框无法显示Windows输入法的问题

然而Kivy的Input却是这样的:
【Python】解决Kivy页面输入框无法显示Windows输入法的问题

输入完成后,字也可以显示出来,可盲选谁能做到啊?!!

为此我翻烂了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控件下面,不过起码是可用了。

以上是 【Python】解决Kivy页面输入框无法显示Windows输入法的问题 的全部内容, 来源链接: utcz.com/a/88819.html

回到顶部