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()
解决方案
你的代码存在三个关键错误,导致窗口无法正常退出:
类方法缩进错误
__init__和set_list方法没有缩进在DrawInformation类内部,Python会将它们视为独立函数而非类的成员方法。实例化DrawInformation时会因缺少构造方法直接报错,后续事件循环逻辑也无法正常执行。事件类型判断错误
事件循环中判断退出事件的逻辑错误:应该用event.type == pygame.QUIT而非event == pygame.QUIT。event是事件对象,pygame.QUIT是事件类型常量,必须通过type属性匹配。代码缩进错误
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
相关产品推荐
相关产品推荐

