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

Mac M1设备上pygame.quit()无法正常退出问题求助

问题

刚接触Python但有一定编程基础,跟着Tech With Tim的教程做排序算法可视化程序时,遇到窗口无法退出的问题:pygame.quit()函数无法正常工作,即使在其前后添加sys.exit()或pygame.display.quit()也无法解决。

相关代码

import pygame
import random 

pygame.init()

class DrawInformation:
    BLACK = 0, 0, 0
    WHITE = 255, 255, 255
    GREEN = 0, 255, 0
    RED = 255, 0, 0
    GREY = 128, 128, 128
    BACKGROUND_COLOR = WHITE

    SIDE_PAD = 100
    TOP_PAD = 150

def __init__(self, width, height, lst):
    self.width = width
    self.height = height

    self.window = pygame.display.set_mode((width, height))
    pygame.display.set_caption("Sorting Algorithm Visualization")
    self.set_list(lst)

def set_list(self, lst):
    self.list = lst
    self.min_val = min(lst)
    self.max_val = max(lst)

    self.block_width = round((self.width - self.SIDE_PAD) / len(lst))
    self.block_height = round((self.height - self.TOP_PAD) / (self.max_val - self.min_val))
    self.start_x = self.SIDE_PAD // 2


def generate_starting_list(n, min_val, max_val):
    lst = []

    for _ in range(n):
        val = random.randint(min_val, max_val)
        lst.append(val)

    return lst


def main():
    run = True
    clock = pygame.time.Clock()

    n = 50
    min_val = 0
    max_val = 100

    lst = generate_starting_list(n, min_val, max_val)
    draw_info = DrawInformation(800, 600, lst)

    while run == True:
        clock.tick(60)

        pygame.display.update()

        for event in pygame.event.get():
            if event == pygame.QUIT:
                run = False

     pygame.display.quit()
     pygame.quit()


if __name__ == "__main__":
     main()
解决方案

你的代码存在三个关键错误,导致窗口无法正常退出:

  1. 类方法缩进错误
    __init__和set_list方法没有缩进在DrawInformation类内部,Python会将它们视为独立函数而非类的成员方法。实例化DrawInformation时会因缺少构造方法直接报错,后续事件循环逻辑也无法正常执行。

  2. 事件类型判断错误
    事件循环中判断退出事件的逻辑错误:应该用event.type == pygame.QUIT而非event == pygame.QUIT。event是事件对象,pygame.QUIT是事件类型常量,必须通过type属性匹配。

  3. 代码缩进错误
    main函数末尾的pygame.display.quit()和pygame.quit()缩进不正确,需要与while循环同级,确保退出循环后执行。

修复后的完整代码

import pygame
import random 

pygame.init()

class DrawInformation:
    BLACK = 0, 0, 0
    WHITE = 255, 255, 255
    GREEN = 0, 255, 0
    RED = 255, 0, 0
    GREY = 128, 128, 128
    BACKGROUND_COLOR = WHITE

    SIDE_PAD = 100
    TOP_PAD = 150

    def __init__(self, width, height, lst):
        self.width = width
        self.height = height

        self.window = pygame.display.set_mode((width, height))
        pygame.display.set_caption("Sorting Algorithm Visualization")
        self.set_list(lst)

    def set_list(self, lst):
        self.list = lst
        self.min_val = min(lst)
        self.max_val = max(lst)

        self.block_width = round((self.width - self.SIDE_PAD) / len(lst))
        self.block_height = round((self.height - self.TOP_PAD) / (self.max_val - self.min_val))
        self.start_x = self.SIDE_PAD // 2


def generate_starting_list(n, min_val, max_val):
    lst = []

    for _ in range(n):
        val = random.randint(min_val, max_val)
        lst.append(val)

    return lst


def main():
    run = True
    clock = pygame.time.Clock()

    n = 50
    min_val = 0
    max_val = 100

    lst = generate_starting_list(n, min_val, max_val)
    draw_info = DrawInformation(800, 600, lst)

    while run == True:
        clock.tick(60)

        pygame.display.update()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

    pygame.display.quit()
    pygame.quit()


if __name__ == "__main__":
    main()

修复后点击窗口关闭按钮即可正常退出程序。若需要更彻底的退出,可在run = False后添加sys.exit(),记得先导入sys模块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:57:14