player-none 发表于 2024-12-1 16:47:18

pygame输入的解决方式

本帖最后由 player-none 于 2024-12-1 16:50 编辑

第一次发文章,格式不恰当请见谅

我去研究了下,怎么让 Pygame 接受中文输入,搜到的方法:

os.environ['SDL_IME_SHOW_UI'] = '1'
...
elif event.type == pygame.TEXTINPUT:
    print(event.text)

试了下,原本输入中文 Pygame 都不会显示的,现在在窗口右下角显示了一条输入法的打字内容,可以正常输入了。

后来研究 pygame.key.xxxx 的时候,无意间发现了这几个函数:

tutu.to/image/R1Pjd

查官网:

pygame.key.set_text_input_rect()
controls the position of the candidate list
set_text_input_rect(Rect) -> None
This sets the rectangle used for typing with an IME. It controls where the candidate list will open, if supported.

也就是说,这个函数可以设置使用 IME 输入时的矩形区域。

经测试,实际起作用的参数只有前两个,后两个需要象征性地输入。调用实例:

pygame.key.set_text_input_rect((输入法最左侧x, 输入法最上侧y, 0, 0))

在 UI 中,用于解决输入框问题:

pygame.key.set_text_input_rect((输入框left, 输入框bottom, 0, 0))

其他两个函数的文档如下:

pygame.key.start_text_input()
start handling Unicode text input events
start_text_input() -> None
Start receiving pygame.TEXTEDITING and pygame.TEXTINPUT events. If applicable, show the on-screen keyboard or IME editor.

For many languages, key presses will automatically generate a corresponding pygame.TEXTINPUT event. Special keys like escape or function keys, and certain key combinations will not generate pygame.TEXTINPUT events.

In other languages, entering a single symbol may require multiple key presses, or a language-specific user interface. In this case, pygame.TEXTINPUT events are preferable to pygame.KEYDOWN events for text input.

A pygame.TEXTEDITING event is received when an IME composition is started or changed. It contains the composition text, length, and editing start position within the composition (attributes text, length, and start, respectively). When the composition is committed (or non-IME input is received), a pygame.TEXTINPUT event is generated.

Text input events handling is on by default.

pygame.key.stop_text_input()
stop handling Unicode text input events
stop_text_input() -> None
Stop receiving pygame.TEXTEDITING and pygame.TEXTINPUT events. If an on-screen keyboard or IME editor was shown with pygame.key.start_text_input(), hide it again.

Text input events handling is on by default.

To avoid triggering the IME editor or the on-screen keyboard when the user is holding down a key during gameplay, text input should be disabled once text entry is finished, or when the user clicks outside of a text box.


[*]pygame.key.start_text_input(): 开始接收输入
[*]pygame.key.stop_text_input(): 停止接收输入


文中加粗的部分体现了 pygame.TEXTINPUT 事件和 pygame.KEYDOWN 事件接收范围的不同:前者不接收 Esc、功能键等。这确实是 pygame.TEXTINPUT 相较于 pygame.KEYDOWN 的优势。

对其提到的 pygame.TEXTEDITING 事件,作用相较于 pygame.TEXTINPUT 不大,它用来接收输入法的改变,确切地说,是 text_input 接收和不接收状态的改变。

—————————————————————————————————————————————————————


[*]对于输入框中文本的显示不做赘述,这个简单,添加重新绘制输入框的函数即可,或者把 text 属性搞个 @property;
[*]对于切换输入状态(接不接收输入事件),可以在鼠标点击输入框的时候做出判断,点击到输入框所在的 rect,就 start,否则 stop,然后设置输入法显示的位置,前文有提到:pygame.key.set_text_input_rect((输入框left, 输入框bottom, 0, 0))

FishC 发表于 2024-12-1 16:47:31

感谢分享您的研究和解决方案!关于如何在 Pygame 中实现中文输入以及相关功能的详细介绍,您的帖子已经很详细了。以下是对您的研究内容的简要总结,希望帮助理解:

主要功能概述:
1. 使用 `pygame.TEXTINPUT` 和 `pygame.TEXTEDITING` 事件来处理文本输入,这两个事件支持 Unicode,适用于多种输入法。
2. 函数 `pygame.key.set_text_input_rect()` 用于设置输入法候选列表的显示位置。
3. `pygame.key.start_text_input()` 和 `pygame.key.stop_text_input()` 用于启用和停用文本输入事件的处理。
4. 使用 `os.environ['SDL_IME_SHOW_UI'] = '1'`,解决了 Pygame 不显示中文输入的问题。

步骤说明:
1. 初始化 Pygame 环境,启用文本输入事件。
2. 使用 `pygame.key.set_text_input_rect()` 定义输入框的位置,从而调整 IME 的候选框显示位置。
3. 使用事件循环检测 `pygame.TEXTINPUT` 以处理输入文本,或 `pygame.TEXTEDITING` 以处理输入编辑状态的更改。
4. 控制输入区域和输入事件的处理方式,这可以通过定义何时启用或禁用文本输入来实现。

关于UI和交互:
- 确保用户点击输入框调整 `start_text_input()` 和 `stop_text_input()` 的调用。
- 每次文本输入完成或用户点击UI其他部分时,合理应用 `stop_text_input()` 防止不必要的输入处理。

这种实现方案有效地利用了 Pygame 的特性来支持中文及其他复杂输入。例如,通过 `pygame.TEXTINPUT` 事件接收生成的字符,而不是像 `pygame.KEYDOWN` 那样逐键处理,这样更符合文本处理的逻辑。

如果有其他问题或需要进一步的帮助,欢迎继续讨论!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼的二师兄 发表于 2024-12-1 17:28:43

第一次发文章,格式不恰当请见谅
这个格式已经超过 80% 的人了~

cjjJasonchen 发表于 2024-12-1 21:20:06

好久没看到这么给力的技术贴了{:10_275:}

player-none 发表于 2024-12-2 19:21:41

cjjJasonchen 发表于 2024-12-1 21:20
好久没看到这么给力的技术贴了

{:10_257:}论坛是咋了

cjjJasonchen 发表于 2024-12-2 21:31:34

player-none 发表于 2024-12-2 19:21
论坛是咋了

感觉热度似乎有点降低了
页: [1]
查看完整版本: pygame输入的解决方式