URLhttps://learnscript.net/zh/pygame/key/input/
    复制链接转到说明  示例

    如何在游戏中使用输入法进行文本输入

    我被代码海扁署名-非商业-禁演绎
    阅读 6:44·字数 2020·发布 

    Pygame 中的文本输入

    Pygame 允许玩家在游戏中使用操作系统的输入法进行文本输入,这需要用到key模块。如果支持,将在输入过程中显示屏幕键盘或输入法编辑器。

    你可以通过文本输入事件获得玩家输入的文本,通过文本编辑事件获得玩家输入的合成文本。合成文本是指可被转换为真正输入文本的文本,比如,书写的拼音。

    pygame模块的TEXTINPUT变量,对应了文本输入事件,该事件可在确定某段输入文本时被引发(比如,在书写拼音后按Enter键确认,或在窗口失去输入焦点后),其对应的Event对象拥有以下变量。

    text 变量

    text变量是一个字符串,表示此次直接输入的文本,或合成文本所转换的输入文本。

    pygame模块的TEXTEDITING变量,对应了文本编辑事件,该事件在合成文本被编辑时引发(比如,书写拼音,或书写拼音后按下方向键移动光标),其对应的Event对象拥有以下变量。

    text 变量

    text变量是一个表示合成文本的字符串。

    start 变量

    start变量是一个整数,表示光标在合成文本中的位置。

    length 变量

    length变量是一个整数,表示合成文本被选中的文本的长度。

    某些输入法或语言仅会引发文本输入事件

    并非所有的输入法或语言均会引发文本输入和文本编辑事件,比如,英文输入法,他可能只会引发文本输入事件。

    某些情况下一些按键不会引发文本输入事件

    在使用输入法的状态下,一些按键不会引发文本输入事件,比如Escape,按下Escape键可能只会引发按键的按下事件或文本编辑事件(具体情况由输入法和语言决定)。

    打开输入法进行文本输入

    key模块的start_text_input函数,可用于打开输入法,这使得玩家可以使用系统当前的输入法进行文本输入。调用该函数将使 Pygame 开始接收文本输入以及文本编辑事件,直到调用stop_text_input函数。

    游戏启动后,Pygame 会默认打开输入法,并接收文本输入以及文本编辑事件,因此,调用start_text_input可能是没有必要的。

    start_text_input()

    start_text_input 函数可能会屏蔽键盘事件

    对于某些输入法或语言,比如中文的拼音输入法,在调用start_text_input函数之后,键盘按键的按下和释放事件可能会在某个阶段被屏蔽。如果通过键盘事件来控制游戏角色,那么按下按键可能不会对游戏角色产生任何影响,直至调用stop_text_input函数或切换输入法。

    当然,某些特殊的按键,比如Escape,依然可能会正常引发按下和释放事件(具体情况由输入法和语言决定)。

    在下面的示例中,我们调用start_text_input来打开输入法(其实可以忽略),在文本编辑和文本输入事件中,分别记录了玩家书写的合成文本和输入文本,他们都将被显示在游戏窗口中。

    需要指出,绘制文本采用了系统字体 Microsoft JhengHei,请确保系统已经安装了该字体,否则输入中文可能无法正常显示。

    start.py
    # 导入 key 模块和其他相关内容,并创建游戏窗口和 Font 对象
    from pygame import key, display, event, font, TEXTEDITING, TEXTINPUT, KEYDOWN, K_ESCAPE
    w = display.set_mode((400, 300))
    font.init()
    f = font.SysFont('Microsoft JhengHei', size=30)
    
    # 打开输入法(可以忽略 start_text_input 的调用) key.start_text_input() # 玩家输入的文本 t = '' # 玩家书写的合成文本 c = ''
    running = True while running: for e in event.get(): if e.type == KEYDOWN: # 如果按下 Esc,则游戏循环结束 if e.key == K_ESCAPE: running = False elif e.type == TEXTEDITING: # 记录玩家书写的合成文本 c = e.text print('编辑事件', e) elif e.type == TEXTINPUT: # 累计玩家输入的文本 t += e.text print('输入事件', e)
    # 将输入文本,合成文本显示在游戏窗口中 w.fill('#000000') sc = f.render(c, True, '#FF0000') tc = f.render(t, True, '#00FF00') w.blit(sc, (0, 0)) w.blit(tc, (0, 50)) display.flip()

    关闭输入法

    key模块的stop_text_input函数,可用于关闭输入法。

    stop_text_input()

    在下面的示例中,如果玩家按下Escape键,则关闭输入法,如果按下Space键,则打开输入法。根据不同的输入法和语言,Escape键可能需要按两次才会生效,第一次为取消已经书写的合成文本。

    close.py
    # 导入 key 模块和其他相关内容,并创建游戏窗口
    from pygame import key, display, event, font, TEXTEDITING, TEXTINPUT, QUIT, KEYDOWN, K_SPACE, K_ESCAPE
    display.set_mode((400, 300))
    
    running = True while running: for e in event.get(): if e.type == QUIT: running = False elif e.type == KEYDOWN: if e.key == K_SPACE: # 如果按下空格键,则打开输入法 key.start_text_input() print('打开输入法') elif e.key == K_ESCAPE: # 如果按下 Esc 键,则关闭输入法 key.stop_text_input() print('关闭输入法') elif e.type == TEXTEDITING: print('编辑事件', e) elif e.type == TEXTINPUT: print('输入事件', e)

    设置输入法候选窗口的显示区域

    key模块的set_text_input_rect函数,可用于设置输入法候选窗口的显示区域,如果输入法提供候选窗口,并且支持显示的话。

    set_text_input_rect(rect)

    rect 参数

    rect参数是一个包含矩形信息的对象,表示了候选窗口的显示区域,该对象的书写格式与Rect对象的构造器的single_arg参数类似。

    矩形

    关于Rect构造器的single_arg参数,你可以查看Pygame 中的 Rect 对象一段。

    源码

    src/zh/key/input·codebeatme/pygame·GitHub

    讲解视频

    如何在 Pygame 中使用输入法输入文本·YouTube如何在 Pygame 中使用输入法输入文本·Bilibili