关于python:解决Kivy页面输入框无法显示Windows输入法的问题

14次阅读

共计 1662 个字符,预计需要花费 5 分钟才能阅读完成。

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

正文完
 0