如何在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
相关产品推荐
相关产品推荐

