如何在Python中将文本框输入保存到变量?附Pygame游戏自定义起始速度需求
嘿,很高兴看到你在Pygame里折腾自己的小游戏!给起始速度加个自定义输入框确实能让玩家更有参与感,我来帮你搞定这个文本输入转整数的问题~
实现Pygame文本输入框并将输入转为整数变量
核心逻辑梳理
要实现这个需求,我们需要完成这几件关键事:
- 监听键盘输入事件,收集用户输入的字符
- 维护一个字符串变量暂存输入内容,处理退格等操作
- 将输入的字符串安全转换为整数,同时处理无效输入(比如非数字内容)
- 把转换后的整数赋值给你的起始速度变量
完整可复用代码示例
下面是一个独立的小示例,你可以直接测试,再把核心逻辑整合到你的游戏里:
import pygame import sys pygame.init() # 基础屏幕设置 screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("设置游戏起始速度") # 颜色定义 WHITE = (255, 255, 255) BLACK = (0, 0, 0) GRAY = (200, 200, 200) RED = (255, 0, 0) # 文本输入核心变量 input_active = False # 标记输入框是否被激活 input_text = "" # 暂存输入的字符串 start_speed = 5 # 默认起始速度(你可以改成自己的初始值) font = pygame.font.Font(None, 36) error_msg = "" # 用来提示无效输入 # 输入框矩形区域(位置和大小可自定义) input_rect = pygame.Rect(screen_width//2 - 120, screen_height//2 - 25, 240, 50) running = True while running: screen.fill(WHITE) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False sys.exit() # 点击输入框激活/取消输入状态 if event.type == pygame.MOUSEBUTTONDOWN: if input_rect.collidepoint(event.pos): input_active = True error_msg = "" # 激活时清空错误提示 else: input_active = False # 处理键盘输入(仅当输入框激活时) if event.type == pygame.KEYDOWN and input_active: if event.key == pygame.K_RETURN: # 按下回车,尝试转换输入为整数 try: # 先判断输入是否为空 if not input_text: error_msg = "请输入数字!" else: temp_speed = int(input_text) # 可以加个速度范围限制,避免数值太极端 if 1 <= temp_speed <= 20: start_speed = temp_speed input_text = "" # 清空输入框 else: error_msg = "速度请在1-20之间!" except ValueError: error_msg = "请输入有效数字!" elif event.key == pygame.K_BACKSPACE: # 退格删除最后一个字符 input_text = input_text[:-1] error_msg = "" else: # 只允许输入数字,过滤其他字符 if event.unicode.isdigit(): input_text += event.unicode error_msg = "" # 绘制输入框(激活时用灰色边框,未激活时黑色) pygame.draw.rect(screen, GRAY if input_active else BLACK, input_rect, 2) # 绘制输入的文本 text_surface = font.render(input_text, True, BLACK) screen.blit(text_surface, (input_rect.x + 8, input_rect.y + 8)) # 显示当前设置的起始速度 speed_text = font.render(f"当前起始速度: {start_speed}", True, BLACK) screen.blit(speed_text, (screen_width//2 - speed_text.get_width()//2, screen_height//2 + 60)) # 显示错误提示(如果有) if error_msg: error_surface = font.render(error_msg, True, RED) screen.blit(error_surface, (screen_width//2 - error_surface.get_width()//2, screen_height//2 + 110)) pygame.display.flip() pygame.quit()
关键部分解释
- 输入激活状态:
input_active变量确保只有用户点击输入框时才处理键盘输入,避免游戏过程中误触输入。 - 字符过滤:
event.unicode.isdigit()只允许数字输入,从源头避免非数字字符干扰。 - 安全转换与验证:用
try-except块处理整数转换的异常,同时加了范围限制和空输入判断,给用户清晰的错误提示,体验更友好。 - 整合到你的游戏:把这段逻辑放到游戏的起始界面(比如主游戏循环前),或者做个“设置”按钮切换到这个模式,拿到
start_speed后再进入主游戏逻辑即可。
适配你现有游戏的小技巧
- 如果你已经有按钮系统,可以把“回车提交”改成“点击确认按钮提交”,逻辑和回车完全一致:点击按钮时执行整数转换和验证。
- 可以把输入框的样式改成和你游戏风格匹配的(比如换颜色、加背景填充)。
- 如果你的游戏有开始界面,可以把这个输入框直接放到开始界面里,和“开始游戏”按钮搭配使用。
这样就能完美实现你想要的功能啦,输入的内容会以整数形式保存到start_speed变量里,还能处理各种异常情况~
内容的提问来源于stack exchange,提问作者Krystian Ochot




