Pygame中如何将输入框的回车输入值存储为供其他函数调用的变量
数字输入框优化实现
核心改动点
- 为InputBox类新增公开属性
stored_value,专门存储回车提交后的有效数字,初始值设为None,标识尚未接收到有效输入,外部函数可直接读取该属性 - 补充输入合法性过滤逻辑,从根源上阻止非数字字符被录入输入框,匹配“仅输入数字”的定位
- 重构回车键按下的处理逻辑:不再执行打印后直接清空文本,而是先校验当前文本格式是否合规,校验通过后转换为数值类型存入
stored_value,再执行清空操作 - 完整保留原有交互逻辑(点击激活/失活、退格删除、输入框宽度自适应、绘制渲染),不改动原有类的初始化、事件绑定、更新、绘制流程
优化后完整代码
class InputBox: def __init__(self, x, y, w, h, text=''): self.rect = pg.Rect(x, y, w, h) self.color = COLOR_INACTIVE self.text = text self.txt_surface = FONT.render(text, True, self.color) self.active = False # 新增:存储提交后的有效数字 self.stored_value = None def handle_event(self, event): if event.type == pg.MOUSEBUTTONDOWN: # 点击切换输入框激活状态 if self.rect.collidepoint(event.pos): self.active = not self.active else: self.active = False self.color = COLOR_ACTIVE if self.active else COLOR_INACTIVE if event.type == pg.KEYDOWN: if self.active: if event.key == pg.K_RETURN: # 校验输入内容是否为有效数字 if self.text.strip(): try: # 若仅需整数,可将float替换为int self.stored_value = float(self.text) # 如需保留输入内容不被清空,删除下方这行即可 self.text = '' except ValueError: # 格式非法时不更新存储值 pass elif event.key == pg.K_BACKSPACE: self.text = self.text[:-1] else: # 输入校验:仅允许数字录入,如需支持小数可放开小数点限制 current_char = event.unicode if current_char.isdigit(): self.text += current_char # 更新文本渲染面 self.txt_surface = FONT.render(self.text, True, self.color) def update(self): width = max(200, self.txt_surface.get_width()+10) self.rect.w = width def draw(self, screen): screen.blit(self.txt_surface, (self.rect.x+5, self.rect.y+5)) pg.draw.rect(screen, self.color, self.rect, 2)
外部读取方式
其他功能函数无需绑定输入事件逻辑,直接通过InputBox实例的stored_value属性读取即可:
def main(): # ...原有初始化逻辑 number_input = InputBox(100, 100, 140, 32) input_boxes.append(number_input) while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True for box in input_boxes: box.handle_event(event) # 其他业务函数读取输入值示例 def get_committed_number(): # 先判断是否已有有效提交值 if number_input.stored_value is not None: return number_input.stored_value return None # 未提交时的默认返回值 for box in input_boxes: box.update() screen.fill((30, 30, 30)) for box in input_boxes: box.draw(screen) pg.display.flip() clock.tick(30)
- 若需要支持小数输入,可将输入校验逻辑调整为:允许录入单个小数点,即当
current_char为.且当前self.text中未包含.时,将该字符追加到文本中即可。
内容的提问来源于stack exchange,提问作者Evaki
相关产品推荐
相关产品推荐

