Pygame绘制方块网格时报TypeError: 'method' object is not iterable如何解决
问题错误梳理与修复方案
直接报错原因
你遇到的TypeError: 'method' object is not iterable错误,是因为没有调用extend方法:background.extend是类的方法对象本身,加括号background.extend()才会执行方法返回你构造的方块列表。
其他隐藏逻辑/语法错误
- 类名不统一:你定义的方块类是
Box,但extend方法里实例化用的是Tile,找不到类会直接报错,把Tile改成Box即可。 pygame.Rect参数语法错误:你写的pygame.Rect(self.ofset,self,size,self.size)是错误写法,self.size被误写为self,size,且Rect需要四个单独的坐标/尺寸参数,正确写法是pygame.Rect(self.ofset[0], self.ofset[1], self.size, self.size)。- 偏移量更新逻辑错误:你当前每生成一个方块就同时给x、y偏移加尺寸,所有方块会排成对角线,无法铺满屏幕。正确逻辑是x坐标逐格累加,一行满了之后重置x、y累加一行高度。
enumerate返回值处理错误:enumerate返回的是(索引, 元素)的元组,你直接对i调用draw方法会报错,需要取元组的第二个元素(也就是方块实例)调用draw。- 多余的排序逻辑:你对枚举后的结果做倒序排序没有实际意义,直接遍历生成的方块列表即可。
- 背景实例化位置不合理:你把
Background的实例化放在了主循环内部,每次刷新都会重新生成一遍所有方块对象,造成不必要的性能浪费,放到循环外即可。 - 实例化参数的注释写法错误:你把注释直接写在参数中间,会触发Python语法错误,要么把参数拆行加注释,要么把注释移到参数外。
修正后的参考代码
类定义部分
import pygame class Box(): def __init__(self, color, rect): self.color = color self.rect = rect def draw(self, surface): pygame.draw.rect(surface, self.color, self.rect) class Background(): def __init__(self, row, column, offset, size, color): self.row = row self.column = column # 保存初始偏移,避免生成方块的时候修改原始值 self.init_offset_x = offset[0] self.init_offset_y = offset[1] self.size = size self.color = color def parse(self): return self.row * self.column def extend(self): total = self.parse() box_list = [] current_x = self.init_offset_x current_y = self.init_offset_y for tile_idx in range(total): # 交替颜色 current_color = self.color[0] if tile_idx % 2 == 0 else self.color[1] box_list.append(Box( current_color, pygame.Rect(current_x, current_y, self.size, self.size) )) # 更新偏移:x加尺寸 current_x += self.size # 一行满了就换行 if (tile_idx + 1) % self.column == 0: current_x = self.init_offset_x current_y += self.size return box_list
主循环部分
# 初始化部分 pygame.init() # 按行列和尺寸计算屏幕大小,5行10列,每个方块30像素 screen_width = 10 * 30 screen_height = 5 * 30 screen = pygame.display.set_mode((screen_width, screen_height)) clock = pygame.time.Clock() # 背景实例化放到循环外,仅生成一次即可 background = Background( row=5, column=10, offset=(0,0), size=30, color=((255,255,255),(0,0,0)) ) box_list = background.extend() # 主循环 while True: # 补充退出事件处理,否则窗口无法正常关闭 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() screen.fill((255,255,255)) # 直接遍历方块列表绘制 for box in box_list: box.draw(screen) pygame.display.flip() clock.tick(60)
内容的提问来源于stack exchange,提问作者Django
相关产品推荐
相关产品推荐

