使用Pygame绘制网格跨文件调用时出现TypeError问题求助
错误原因分析
你遇到的问题核心是类方法的参数定义不符合Python的面向对象规则,导致调用时参数传递完全混乱:
- 在Python中,类的普通方法(没有
@staticmethod或@classmethod装饰)默认第一个参数是类的实例对象(通常命名为self)。 - 你定义的
drawgrid方法没有声明这个参数,当你用draw.drawgrid(50)调用时,Python会自动把draw(也就是graph的实例)作为第一个参数传给drawgrid——这就导致原本的step变量实际上接收的是graph实例,而不是你传入的50。 - 后面的
x//step自然会报错,因为你试图用整数除以一个类实例,这是不支持的操作;你改成int(step)也没用,因为int()无法把类实例转换成整数。
解决方法
有两种规范的修正方式,推荐第一种(面向对象的标准写法):
方式1:将drawgrid改为实例方法(推荐)
把graph类改成需要初始化的形式,将窗口、画布尺寸作为实例属性,同时给drawgrid添加self参数:
修改grapher.py的代码:
import pygame class graph(): def __init__(self, win, canvas_width, canvas_height): self.win = win # 保存窗口对象 self.x = canvas_width # 画布宽度 self.y = canvas_height # 画布高度 def drawgrid(self, step, t=1): for i in range(0, self.x // step): # 绘制竖线 pygame.draw.line(self.win, (0, 0, 255), (i*step, 0), (i*step, self.y), t) # 绘制横线 pygame.draw.line(self.win, (0, 0, 255), (0, i*step), (self.x, i*step), t) pygame.display.update()
修改main.py的代码:
import grapher import pygame x = 500 y = 500 # 注意这里你之前漏了定义y变量,会直接导致报错! win = pygame.display.set_mode((x, y)) pygame.display.set_caption("Graph") # 初始化graph实例,传入窗口和尺寸 draw = grapher.graph(win, x, y) run = True while(run): pygame.time.delay(100) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False draw.drawgrid(50) # 现在调用就会正确传递step参数 pygame.quit()
方式2:将drawgrid改为静态方法
如果你不想用实例化的方式,可以给drawgrid加上@staticmethod装饰器,同时把需要的win、x、y作为参数传入:
修改grapher.py的代码:
import pygame class graph(): @staticmethod def drawgrid(win, x, y, step, t=1): for i in range(0, x // step): pygame.draw.line(win, (0, 0, 255), (i*step, 0), (i*step, y), t) pygame.draw.line(win, (0, 0, 255), (0, i*step), (x, i*step), t) pygame.display.update()
修改main.py的调用代码:
# 不需要实例化,直接调用静态方法 grapher.graph.drawgrid(win, x, y, 50)
内容的提问来源于stack exchange,提问作者NotMyName
相关产品推荐
相关产品推荐

