You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyGame中将输入框悬停光标改为文本光标?

在PyGame中实现输入框悬停时的文本编辑光标

方法一:使用PyGame内置系统光标(最简方案)

PyGame内置了对应文本编辑场景的系统光标常量pygame.SYSTEM_CURSOR_IBEAM,这就是你编辑txt文件时看到的竖线型光标,直接调用即可实现需求。

实现步骤

  1. 定义输入框的矩形区域,用于判断鼠标悬停范围
  2. 在主循环中实时检测鼠标位置:
    • 鼠标悬停在输入框内时,切换为IBEAM光标
    • 离开输入框时,恢复默认箭头光标

代码示例

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
input_rect = pygame.Rect(100, 100, 200, 30)  # 输入框区域
clock = pygame.time.Clock()

running = True
while running:
    screen.fill((255, 255, 255))
    pygame.draw.rect(screen, (0, 0, 0), input_rect, 2)  # 绘制输入框边框

    # 检测鼠标悬停状态
    mouse_pos = pygame.mouse.get_pos()
    if input_rect.collidepoint(mouse_pos):
        pygame.mouse.set_cursor(pygame.SYSTEM_CURSOR_IBEAM)
    else:
        pygame.mouse.set_cursor(pygame.SYSTEM_CURSOR_ARROW)

    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

方法二:自定义光标(兼容全系统,支持定制样式)

如果系统默认的IBEAM光标不符合你的视觉需求,或者遇到系统兼容性问题,可以手动绘制自定义光标。

实现步骤

  1. 创建光标形状的Surface(比如窄竖线)
  2. 将Surface转换为PyGame可识别的光标数据
  3. 同样通过鼠标位置检测切换光标

代码示例

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
input_rect = pygame.Rect(100, 100, 200, 30)
clock = pygame.time.Clock()

# 生成自定义竖线光标(宽2px,高20px)
cursor_surface = pygame.Surface((2, 20))
cursor_surface.fill((0, 0, 0))
# 将Surface转为光标格式数据
cursor_data = pygame.cursors.compile(cursor_surface.get_bitsize(), cursor_surface.get_bytesize())
custom_cursor = ((2, 20), (0, 0), cursor_data[0], cursor_data[1])  # 光标尺寸、热点、数据、掩码

running = True
while running:
    screen.fill((255, 255, 255))
    pygame.draw.rect(screen, (0, 0, 0), input_rect, 2)

    mouse_pos = pygame.mouse.get_pos()
    if input_rect.collidepoint(mouse_pos):
        pygame.mouse.set_cursor(*custom_cursor)
    else:
        pygame.mouse.set_cursor(pygame.SYSTEM_CURSOR_ARROW)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

额外优化:闪烁光标效果

如果需要模拟真实文本编辑器的闪烁光标,可以添加计时器控制光标可见性:

# 循环外初始化变量
cursor_timer = 0
cursor_visible = True
input_active = False  # 标记输入框是否被激活

# 循环内更新计时器与光标状态
cursor_timer += clock.tick(60)
if cursor_timer > 500:  # 每500ms切换一次可见性
    cursor_visible = not cursor_visible
    cursor_timer = 0

# 当输入框激活且光标可见时,绘制光标
if input_active and cursor_visible:
    # 假设input_text是输入框内的文本,计算光标位置
    text_surface = pygame.font.Font(None, 24).render(input_text, True, (0,0,0))
    cursor_x = input_rect.x + 5 + text_surface.get_width()
    cursor_y = input_rect.y + (input_rect.height - 20) // 2
    pygame.draw.line(screen, (0,0,0), (cursor_x, cursor_y), (cursor_x, cursor_y+20), 2)

内容的提问来源于stack exchange,提问作者PizzerLover123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:05:40