【问题标题】:Chasing game - Error message: "'module' object has no attribute 'display'"追逐游戏 - 错误消息:“‘模块’对象没有属性‘显示’”
【发布时间】:2015-11-24 19:31:50
【问题描述】:

我是编程新手,我正在尝试设置一个模拟,其中一个圆圈以随机模式移动,并被第二个圆圈追逐。最终我希望添加 5 个圆圈作为随机移动的干扰物。

在代码中,我将随机移动的圆圈称为“鼠标”,将追逐的圆圈称为“猫”。

我在网上研究并查看了其他人的代码以获取想法,这是我迄今为止提出的:

from pygame import *
import random
import sys, pygame, math, random
from pygame.locals import *

pygame.init()
background_colour = (255,255,255)
(width, height) = (1024, 768)
screen = pygame.display.set_mode((width, height),pygame.FULLSCREEN)


class Mouse(pygame.sprite.Sprite):
    def __init__(self, (x, y), size):
        pygame.sprite.Sprite.__init__(self)
        self.x = MX
        self.y = MY
        self.size = 30
        self.colour = (0, 0, 0)
        self.thickness = 2
        self.speed = 2
        self.angle = random.uniform(0, math.pi*2)


    def display(self):
        pygame.draw.circle(screen, self.colour, (int(MX), int(MY)), self.size, self.thickness)

    def move(self):
        self.x += math.sin(self.angle) * self.speed
        self.y -= math.cos(self.angle) * self.speed


class Cat(pygame.sprite.Sprite):
    def __init__(self, (x, y), size):
        pygame.sprite.Sprite.__init__(self)
        self.x = CX
        self.y = CY
        self.size = 30
        self.colour = (0, 0, 0)
        self.thickness = 2
        self.speed = 2
        self.angle = random.uniform(0, math.pi*2)
        pixChangeC = 2

    def display(self):
        pygame.draw.circle(screen, self.colour, (int(CX), int(CY)), self.size, self.thickness)

    def move(self):
        if MX >= CX:
            CX += pixChangeC    
        else:
            CX -= pixChangeC
        if MY >= CY:
            CY += pixChangeC
        else:
            CY -= pixChangeC

def main():

    pygame.display.set_caption('Chase')
    mouse = Mouse()
    cat = Cat()


running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
            pygame.quit()
            sys.exit()


    screen.fill(background_colour)

    mouse.display()
    mouse.move()
    cat.display()
    cat.move()

    pygame.display.flip() 

不幸的是,当我尝试像这样运行代码时,我收到以下错误消息:

" 文件 "C:...",第 75 行,在 鼠标.display() AttributeError: 'module' 对象没有属性 'display'"

我在网上找不到关于哪里出错的答案,所以如果有人有一些建议/想法,我将不胜感激!

【问题讨论】:

  • 看起来你的缩进也有点不对劲。也许这只是一个拙劣的复制粘贴工作。 running = True 下的所有内容都是main() 块的一部分吗?按照以下答案中的建议将您的实例更改为myMousemyCat 会更清楚,并且可以帮助避免这种情况。至少会使逻辑调试更容易。

标签: python pygame attributeerror


【解决方案1】:

我认为问题在于 pygame 也有一个 mouse 类,并且由于您使用 from 导入 pygame,它会覆盖您的鼠标类。通过将您的类实例名称更改为其他名称来解决此问题。 (例如 myMouse)

【讨论】:

  • 感谢您的回答!我将类的名称更改为“MyMouse”,但现在当我尝试调用 MyMouse.display() 时,我收到以下错误消息“文件“C:…”,第 68 行,在 MyMouse.display()类型错误:必须以 MyMouse 实例作为第一个参数调用未绑定的方法 display()(什么都没有)
  • 我认为 @pydude 的意思是让您将实例名称 mouse 更改为 myMouse 而不是类 Mouse。上面的错误是因为你在一个类上调用 display() 函数。尝试在类的实例上调用它。你已经在 main 中初始化了它,但我没有看到你在调用 main 块。
【解决方案2】:

确保当前目录或 PYTHONPATH 中没有其他 pygame 模块。尝试打印

print(str(pygame.__file__))

检查您是否正在导入正确的包。

【讨论】:

    【解决方案3】:

    Pydude 走在正确的轨道上,但过早停止了。您会收到一条非常无用的错误消息,因为当您使用 from blank import * 导入 pygame 方法时会导入 pygame.mouse(带有小 m),但它应该覆盖您拥有 mouse = Mouse() 的那个。问题是你的缩进是错误的。从running = True 向下的所有内容都需要再次缩进,包括该行。然后,要运行 main() 函数,您需要在文件末尾包含以下内容:

    if __name__ == "__main__":
        main()
    

    因此,当您按原样运行代码时会发生什么,它会直接跳过 main() 方法(在您的代码中从未调用过)并在缩进返回后运行这些东西,从 @987654327 开始@。当它到达mouse.display() 您实际上还没有运行mouse = Mouse(),所以它使用从pygame 导入的mousemouse 没有 display() 方法,因此您的错误消息。

    修复该问题后,您的代码中会出现更多错误,但此更改将使您摆脱这一错误。下一个至少有一个更有用的错误消息,所以你应该能够弄清楚。

    另外,一些建议:from blank import * 不鼓励正是这个原因。最好要么做import pygame,然后将所有内容都称为pygame.sprite(你已经在做......这很奇怪你同时做......)或者做from pygame import sprite, foo, bar, ...并明确列出您想要从该模块中获得的每个特定内容。这两种方法可以防止您的命名空间中出现未知的东西,并且可以防止您收到这个您无法弄清楚的令人困惑的错误消息。

    【讨论】:

    • 补充讨论,在 Python 中使用 main() 函数是不必要的,而且非常具有误导性,尤其是对于那些习惯于 Java 等语言的人来说。它被视为 Python 脚本中的任何其他功能块。它仅在调用时执行。 def 块之外的代码是在调用 Python 文件时将执行的代码(即 python myScript.py)。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2018-05-23
    相关资源
    最近更新 更多