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

如何在Pygame中提取并保存文本输入框的字符串?

解决Pygame多输入框文本提取问题

你遇到的问题本质很简单:每个InputBox实例都独立维护自己的text属性,只要直接访问对应实例的这个属性,就能拿到该输入框的内容,不会混在一起。下面给你两种实用的提取方式:

方式一:直接通过实例变量提取

你已经创建了input_box1到input_box6这6个独立实例,随时可以通过它们的.text属性获取内容,比如在需要保存或使用的时候:

# 示例:在退出程序或触发保存事件时提取
client_name = input_box1.text
client_addr1 = input_box2.text
client_addr2 = input_box3.text
project_num = input_box4.text
project_addr1 = input_box5.text
project_addr2 = input_box6.text

# 验证输出
print(f"客户名称:{client_name}")
print(f"项目完整地址:{project_addr1} {project_addr2}")

方式二:给输入框加标识,批量提取

如果想更清晰地对应输入框和内容,可以给InputBox类添加name属性,方便批量管理:

修改InputBox类

class InputBox:
    def __init__(self, x, y, w, h, name='', text=''):
        self.rect = pygame.Rect(x, y, w, h)
        self.color = COLOR_INACTIVE
        self.name = name  # 添加输入框标识名称
        self.text = text
        self.txt_surface = FONT.render(text, True, self.color)
        self.active = False

    # 其他方法保持不变...

创建输入框时指定标识

input_box1 = InputBox(100, 150, 140, 32, name='client_name')
input_box2 = InputBox(100, 250, 140, 32, name='client_addr1')
input_box3 = InputBox(100, 350, 140, 32, name='client_addr2')
input_box4 = InputBox(100, 450, 140, 32, name='project_num')
input_box5 = InputBox(100, 550, 140, 32, name='project_addr1')
input_box6 = InputBox(100, 650, 140, 32, name='project_addr2')

批量收集到字典

# 一次性收集所有输入内容到字典
input_data = {}
for box in input_boxes:
    input_data[box.name] = box.text

# 使用时通过键直接获取
print(f"项目编号:{input_data['project_num']}")
print(f"客户地址:{input_data['client_addr1']} {input_data['client_addr2']}")

补充:原代码的小问题修复

你的原代码存在运行报错的问题:screen.blit的代码放在了主循环外面,会导致窗口未初始化就渲染文本。需要把这些渲染代码移到主循环内,每次循环先填充背景再绘制内容,避免文本重叠:

修改后的main函数核心部分:

def main():
    pygame.init()  # 必须先初始化pygame
    screen = pygame.display.set_mode((800, 750))  # 创建窗口
    pygame.display.set_caption('Geotechnically Write V.1')
    
    clock = pygame.time.Clock()
    # 输入框创建代码保持不变...
    input_boxes = [input_box1, input_box2, input_box3, input_box4, input_box5, input_box6]
    done = False

    # 字体和文本渲染代码保持不变...

    while not done:
        screen.fill((255,255,255))  # 每次循环填充白色背景,清除上一帧内容
        # 绘制标题和提示文本
        screen.blit(title_text,(250,50))
        screen.blit(text3,(50,100))   
        screen.blit(text4,(50,200))   
        screen.blit(text5,(50,300))
        screen.blit(text6,(50,400))  
        screen.blit(text7,(50,500))  
        screen.blit(text8,(50,600))

        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                # 退出前提取并打印输入内容
                print(f"客户名称:{input_box1.text}")
                print(f"项目编号:{input_box4.text}")
                done = True
            for box in input_boxes:
                box.handle_event(event)

        # 更新和绘制输入框
        for box in input_boxes:
            box.update()
        for box in input_boxes:
            box.draw(screen)

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

这样修改后,程序可以正常运行,你也能在需要的场景(比如退出程序、点击保存按钮)轻松提取每个输入框的文本内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:30:57