[解决]详细步骤:kivy输入框不显示中文输入法候选框

本文介绍了如何解决Kivy中中文输入框显示乱码和候选框问题,包括下载并替换SDL2.dll、使用VisualStudio2022编译源码、修改SDL_windowskeyboard.c等步骤,以使Kivy支持中文输入法。
摘要由CSDN通过智能技术生成

问题

  • 1、kivy输入框显示中文乱码:这个问题网上已经有很多了,指定中文字体即可,不再赘述。

  • 2、kivy输入框输入中文不显示候选框:网上找了很多文章都是解决第一个问题,或者第二个问题只说一半,说要改这个文件SDL_windowskeyboard.c

但是我就奇怪了,我哪来这个文件的?很多文章就说改,也不说在哪,还有那个SDL2.dll在哪啊?我就刚开始用kivy,发现中文问题,哪知道要打包才有?

找了一个通宵,动手试了几次,终于找到解决方案了!难以入眠,就分享出解决方案和具体步骤。

参考文章

文章较为古老了,vs2012都找不到了,所以我重新分享一下。

解决方案

1、成品分享

废话不多说,要快速解决的话为何不直接分享呢?这是我打出来的SDL2.dll,用于x64位,使用最新kivy==v2.3.0Python==3.11,输入法候选框可以显示。

  • 1.1 下载文件

点我下载(提取码:p84v

  • 1.2 替换文件

下载后,将SDL2.dll替换掉python安装目录下的SDL2.dllkivy用的就是这一个SDL2.dll(而不是pygame下的那个dll)。比如我的位置在E:\Python3.11\share\sdl2\bin\SDL2.dll。如果你担心出问题,先将原文件备份一份。

  • 1.3 万一丢失文件

万一你把原文件弄丢了,那也不要紧,重新安装一次。先卸载,卸载后再安装就好了:

pip uninstall docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew

pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew

2、详细步骤

  • 2.1 下载安装Visual Studio 2022

VS2022 官网下载

社区版就够了,安装时可以啥扩展都不加,安装有点慢,要装2G以上的东西,耐心等待。(它和Visual Studio Code是两个不同的产品,不要弄混了)

  • 2.2 下载SDL2源码

有兴趣可以看一下仓库,仓库链接:SDL release-2.30.2,要下载Source code 这个源码而不是前面的程序包。

gihub访问较为缓慢,不想看仓库的话,我直接贴出下载链接:https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.30.2.zip,有高速通道的朋友可自行切换。

  • 2.3 用VS2022打开SDL项目

源码解压后,把它作为项目用VS2022打开。你可以试一下,找到/VisualC/SDL.sln,右键单击,生成一下,最后可以看到生成的文件路径。后续生成前先要清理。

生成

  • 2.4 修改SDL_windowskeyboard.c源码

重点来了,传说中的这个文件终于出现了。在VS2022中按下Ctrl+F依次搜索,可以在其他文件中明确看到它的位置。它在这个源码包里,位置:src\video\windows\SDL_windowskeyboard.c

在前面几行的这一行#ifndef SDL_DISABLE_WINDOWS_IME前一行添加#define SDL_DISABLE_WINDOWS_IME,记得保存。添加后如下(注释就不贴了):

#include "../../SDL_internal.h"

#if defined(SDL_VIDEO_DRIVER_WINDOWS) && !defined(__XBOXONE__) && !defined(__XBOXSERIES__)

#include "SDL_windowsvideo.h"
#include "SDL_hints.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);
static SDL_bool IME_IsTextInputShown(SDL_VideoData *videodata);
#endif /* !SDL_DISABLE_WINDOWS_IME */
  • 2.5 生成release版

此时已经可以生成了,但默认是生成debug版,文件略大,据说会影响一点点性能,但也可以用。

i. 在右侧双击前面那个/VisualC/SDL.sln文件,进入子项目。

ii. 改成release版、选择对应平台,32位选win32,64位选x64,如图:

选择release和平台
iii. 生成解决方案

上方菜单点击:生成-生成解决方案,或右侧目录右键:单击选择生成。输出结果的同级目录可以找到SDL2.dll。也就是在\SDL-release-2.30.2\VisualC\x64\Release\SDL2.dll
生成结果

  • 2.6 替换原文件

同1.2

  • 2.7 重新运行kivy

再次运行可以看到输入法候选框了。
输入法候选框

仍存在的小问题

仍存在有无伤大雅的两个小问题:

  1. 候选框始终在右下角。

  2. 输入有内容后,再输入后续文字但未选择文字打出时,如果你退格的话,不仅会删除输入法中未打出的字母,也会把前面的内容退格删除掉。

但比起无法显示候选框还是好多了,希望官方能及时解决吧。

如果强迫症无法忍受,我再推荐一篇文章,直接在程序内部实现的候选框的方式:

kivy解决中文输入的另外一种思路

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值