Python 追逐游戏-错误消息:“'module'对象没有'display'属性”

Python 追逐游戏-错误消息:“'module'对象没有'display'属性”,python,pygame,attributeerror,Python,Pygame,Attributeerror,我是编程新手,正在尝试建立一个模拟,其中一个圆圈以随机模式移动,而另一个圆圈正在追逐我。最后,我希望能添加5个圆圈作为干扰,随机移动 在代码中,我称之为“随机移动的圆圈”鼠标和“追逐的圆圈”猫 我在网上进行了研究,查看了其他人的代码以获得想法,这就是我到目前为止的想法: from pygame import * import random import sys, pygame, math, random from pygame.locals import * pygame.init() bac

我是编程新手,正在尝试建立一个模拟,其中一个圆圈以随机模式移动,而另一个圆圈正在追逐我。最后,我希望能添加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行,在 鼠标显示 AttributeError:“模块”对象没有属性“显示”


我无法在网上找到关于我哪里出了问题的答案,因此如果有人有一些建议/想法,我将非常感谢任何帮助

我认为问题是因为pygame也有一个鼠标类,而且由于您使用from导入pygame,它正在覆盖您的鼠标类。通过将类实例名称更改为其他名称来修复此问题。e、 g.myMouse

我认为问题是因为pygame也有一个鼠标类,而且由于您正在使用from导入pygame,它正在覆盖您的鼠标类。通过将类实例名称更改为其他名称来修复此问题。e、 我的老鼠

Pydude走上了正确的道路,但停得太快了。您将收到一条非常没有帮助的错误消息,因为当您使用pygame的from blank import*导入方法时,会导入带有小m的pygame.mouse,但它应该会覆盖鼠标=鼠标的位置。问题是你的缩进是错误的。从running=True向下的所有内容都需要再次缩进,包括该行。然后,要运行主函数,需要在文件末尾包含以下内容:

if __name__ == "__main__":
    main()
因此,当您按原样运行代码时,它会跳过代码中从未调用过的主方法,并在缩进返回后运行内容,从running=True开始。当它到达mouse.display时,您实际上还没有运行mouse=mouse这一行,所以它使用从pygame导入的鼠标。该鼠标没有显示方法,因此会显示错误消息

修复后,代码中会出现更多错误,但此更改将使您克服这一错误。下一个至少有一个更有用的错误消息,所以您应该能够找到它


另外,一些建议:正是出于这个原因,不鼓励使用“从空白导入”。最好是导入pygame并将所有内容都称为pygame.sprite,您已经在这样做了…奇怪的是,您正在同时这样做。。。或者从pygame导入sprite、foo、bar。。。并明确列出您希望从该模块中获得的每一项具体内容。这两种方法可以防止未知内容扰乱您的名称空间,也可以防止您收到无法理解的令人困惑的错误消息。

Pydude的方法是正确的,但停止得太早了。您将收到一条非常没有帮助的错误消息,因为当您使用pygame的from blank import*导入方法时,会导入带有小m的pygame.mouse,但它应该会覆盖鼠标=鼠标的位置。问题是你的缩进是错误的。从running=True向下的所有内容都需要再次缩进,包括该行。然后,要运行主函数,需要在文件末尾包含以下内容:

if __name__ == "__main__":
    main()
因此,当您按原样运行代码时,它会跳过代码中从未调用过的主方法,并在缩进返回后运行内容,从running=True开始。当它到达mouse.display时,您实际上还没有运行mouse=mouse这一行,所以它使用从pygame导入的鼠标。该鼠标没有显示方法,因此会显示错误消息

修复后,代码中会出现更多错误,但此更改将使您克服这一错误。下一个至少有一个更有用的错误消息,所以您应该能够找到它


另外,一些建议:正是出于这个原因,不鼓励使用“从空白导入”。最好是导入pygame并将所有内容都称为pygame.sprite,您已经在这样做了…奇怪的是,您正在同时这样做。。。或者从pygame导入sprite、foo、bar。。。并明确列出您希望从该模块中获得的每一项具体内容。这两种方法可以防止未知内容扰乱您的命名空间,并防止您收到无法理解的错误消息。

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

print(str(pygame.__file__))

检查是否导入了正确的软件包。

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

print(str(pygame.__file__))
检查是否有问题
您正在导入正确的包。

看起来您的缩进也有点不正确。也许这只是一个拙劣的复制粘贴工作。所有正在运行的东西都是主块的一部分吗?按照下面的答案将您的实例更改为myMouse和myCat会更清晰,并有助于避免类似情况。至少会使逻辑调试更容易。看起来缩进也有点不对劲。也许这只是一个拙劣的复制粘贴工作。所有正在运行的东西都是主块的一部分吗?按照下面的答案将您的实例更改为myMouse和myCat会更清晰,并有助于避免类似情况。至少会使逻辑调试更容易。谢谢你的回答!我将类的名称更改为MyMouse,但现在当我尝试调用MyMouse.display时,我收到以下错误消息文件C:…,第68行,在MyMouse.display TypeError中:必须使用MyMouse实例调用unbound方法display,因为第一个参数没有得到任何结果。我认为@pydude的意思是将实例名称mouse更改为MyMouse,而不是类mouse。上面的错误是因为您正在类上调用display函数。尝试在类的实例上调用它。您已经在main中初始化了它,但是我没有看到您调用main块。谢谢您的回答!我将类的名称更改为MyMouse,但现在当我尝试调用MyMouse.display时,我收到以下错误消息文件C:…,第68行,在MyMouse.display TypeError中:必须使用MyMouse实例调用unbound方法display,因为第一个参数没有得到任何结果。我认为@pydude的意思是将实例名称mouse更改为MyMouse,而不是类mouse。上面的错误是因为您正在类上调用display函数。尝试在类的实例上调用它。您已经在main中初始化了它,但是我没有看到您调用main块。为了补充讨论,在Python中使用main函数是不必要的,而且非常容易引起误解,特别是对于那些习惯于Java等语言的人来说。它被视为Python脚本中的任何其他函数块。它只在被调用时执行。def块之外的代码是调用Python文件(即Python myScript.py)时将执行的代码。为了补充讨论,在Python中使用main函数是不必要的,并且会产生误导,特别是对于那些习惯于Java等语言的人。它被视为Python脚本中的任何其他函数块。它只在被调用时执行。def块之外的代码是调用Python文件时将执行的代码,即Python myScript.py。