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

Pygame开发Hangman游戏:注释win.fill后按钮不消失的问题求助

Pygame Hangman游戏按钮点击不消失问题解答

问题描述

我正在使用Pygame制作Hangman(猜单词)游戏,遇到如下现象:

  • 直接运行代码,点击圆形按钮后按钮会消失,符合游戏预期逻辑;
  • 但如果注释掉代码中的win.fill('darkred')一行,点击按钮后按钮不再消失。

问题代码

import pygame , math
pygame.init()
WIDTH , HEIGHT = 900 , 600
win = pygame.display.set_mode((WIDTH , HEIGHT))
pygame.display.set_caption('Hangmane')
RUN = True

# 存储按钮坐标的列表
letters = [ ]
RADIUS = 20 
BUTTON_X = 0
BUTTON_Y = 457
for i in range(26):
    BUTTON_X += 60
    if i == 14:
        BUTTON_X = 100
        BUTTON_Y = 520
    letters.append([BUTTON_X, BUTTON_Y])                

# 绘制所有按钮(圆形)
def button():
    for letter in letters:
        BUTTON_X , BUTTON_Y = letter
        pygame.draw.circle(win,'green',(BUTTON_X,BUTTON_Y),RADIUS,3)

# 移除被点击的按钮坐标
def click_checker(coordinates):
    letters.remove(coordinates)

while RUN:
    win.fill('darkred') # 注释这一行后按钮点击不消失
    button()
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            RUN = False
        if event.type == pygame.MOUSEBUTTONDOWN:
                pos_x , pos_y = pygame.mouse.get_pos()
                for letter in letters:
                    BUTTON_X , BUTTON_Y = letter
                    dis = math.sqrt((BUTTON_X-pos_x)**2 + (BUTTON_Y-pos_y)**2)
                    if dis < RADIUS: # 判断鼠标是否点击到圆形按钮内
                        click_checker(letter)

pygame.quit()

原因解释

这是Pygame的帧缓冲渲染机制导致的:

  • Pygame的窗口画面由一帧一帧的像素数据组成,每次绘制操作都是在当前帧的像素上叠加内容;
  • 调用win.fill('darkred')时,会将整个窗口的像素全部覆盖为深红色,相当于清空了上一帧的所有残留内容;
  • 之后button()函数只会绘制当前letters列表中剩余的按钮,被点击移除的按钮不会被重新绘制,所以窗口上看不到它了;
  • 如果注释掉win.fill(),上一帧绘制的所有按钮像素不会被清除——即使你从letters列表里移除了某个按钮的坐标,它之前的图形还留在窗口上,和新绘制的按钮叠加在一起,看起来就像按钮没消失。

简单说:每一帧都需要先清空画布,再重新绘制当前所有需要显示的元素,否则旧的渲染内容会一直残留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:09:12