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

Pygame计算器开发:点击按钮后数字无法持续显示的问题求解

解决Pygame计算器点击按钮后数字持续显示的问题

你的问题出在绘制逻辑和事件逻辑绑定过紧:当前代码仅在鼠标按下(MOUSEBUTTONDOWN事件触发)的那一瞬间绘制数字,但游戏主循环每帧都会用screen.fill("black")清空屏幕,松开鼠标后没有对应事件触发,数字自然不会被重新绘制,所以消失。

解决方法是用一个状态变量记录是否需要显示数字,把事件处理和绘制逻辑分开:事件只负责改变状态,绘制部分根据状态决定是否渲染数字。

修改后的完整代码:

import pygame
from sys import exit

pygame.init()
screen = pygame.display.set_mode((600,800))
pygame.display.set_caption("Calculator")
clock = pygame.time.Clock()
font1 = pygame.font.Font("c:/Users/oreni/OneDrive/Masaüstü/sprites/minecraft.ttf", 100)

one = 1
# 添加状态变量,标记是否显示数字1
show_one = False

one_main = font1.render(str(one), False, "black")
one_main_r = one_main.get_rect(center = (75,100))

one_button = pygame.Surface((142.5,142.5))
one_button.fill("white")
one_button_r = one_button.get_rect(topleft = (0,160))

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        # 把事件判断移到事件循环内部,避免event变量溢出
        if event.type == pygame.MOUSEBUTTONDOWN:
            if one_button_r.collidepoint(event.pos):
                # 点击按钮时切换状态(如果需要反复点击显示/隐藏,就用show_one = not show_one)
                show_one = True

    screen.fill("black")
    screen.blit(one_button,one_button_r)

    # 根据状态变量决定是否绘制数字,而不是依赖单次事件
    if show_one:
        screen.blit(one_main,one_main_r)

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

关键修改点:

  1. 添加show_one状态变量,初始为False,点击按钮时设为True;如果需要支持点击切换显示/隐藏,可改为show_one = not show_one。
  2. 将MOUSEBUTTONDOWN的判断移到事件循环内部,避免主循环中引用event变量时出现未定义问题(原代码中如果没有事件触发,event变量可能不存在)。
  3. 绘制数字的逻辑从事件处理中分离出来,放在主循环的绘制阶段,每帧都会根据show_one的状态决定是否渲染数字。

这样修改后,点击按钮后show_one保持True,每帧都会重新绘制数字,就能实现持续显示的效果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:21:38