追逐游戏 - 错误信息:“'module' 对象没有属性 'display'”
Chasing game - Error message: "'module' object has no attribute 'display'"
我是编程新手,我正在尝试建立一个模拟,其中一个圆圈以随机模式移动并被第二个圆圈追赶。最终我希望添加 5 个圆圈作为随机移动的干扰物。
在代码中我调用了随机移动的圆 "Mouse" 和追逐的圆 "Cat"。
我在网上进行了研究并查看了其他人的代码以获取想法,这就是我到目前为止的想法:
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 行,位于
mouse.display()
AttributeError: 'module' 对象没有属性 'display'"
我无法在网上找到我哪里出错的答案,所以如果有人有一些 advice/ideas,我将不胜感激!
我认为问题是因为 pygame 也有一个 class mouse
,并且由于您是用 from
导入 pygame,所以它是覆盖您的鼠标 class。通过将 class 实例名称更改为其他名称来解决此问题。 (例如 myMouse)
Pydude 走在正确的轨道上,但停得太快了。您收到一条非常无用的错误消息,因为当您使用 from blank import *
方法导入 pygame 时导入了 pygame.mouse
(带有一个小的 m),但它应该覆盖那个你有 mouse = Mouse()
。问题是你的缩进是错误的。 running = True
以下的所有内容都需要再次缩进,包括该行。然后,要使 main()
函数变为 运行,您需要在文件末尾包含:
if __name__ == "__main__":
main()
所以当您 运行 代码时发生的事情是它直接跳过 main() 方法(您的代码中永远不会调用它)并且 运行s缩进后的内容返回,从 running = True
开始。当它到达 mouse.display()
你实际上还没有 运行 mouse = Mouse()
行 所以它使用从 [=36 导入的 mouse
=]. mouse
没有 display()
方法,因此出现您的错误消息。
修复该错误后,您的代码中会出现更多错误,但这一更改将使您克服这一错误。下一个至少有一个更有帮助的错误消息,所以你应该能够弄明白。
另外,一些建议:from blank import *
正是因为这个原因而不鼓励。最好是做 import pygame
并引用所有内容,例如 pygame.sprite
(你已经在做......这很奇怪你正在做这两个......)或者做 from pygame import sprite, foo, bar, ...
并明确列出您想要从该模块中获得的每个特定内容。这两种方法可以防止未知的东西使您的命名空间混乱,并且可以防止您收到您无法理解的令人困惑的错误消息。
确保您的当前目录或 PYTHONPATH 中没有另一个 pygame 模块。尝试打印
print(str(pygame.__file__))
检查您是否导入了正确的包。
我是编程新手,我正在尝试建立一个模拟,其中一个圆圈以随机模式移动并被第二个圆圈追赶。最终我希望添加 5 个圆圈作为随机移动的干扰物。
在代码中我调用了随机移动的圆 "Mouse" 和追逐的圆 "Cat"。
我在网上进行了研究并查看了其他人的代码以获取想法,这就是我到目前为止的想法:
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 行,位于 mouse.display() AttributeError: 'module' 对象没有属性 'display'"
我无法在网上找到我哪里出错的答案,所以如果有人有一些 advice/ideas,我将不胜感激!
我认为问题是因为 pygame 也有一个 class mouse
,并且由于您是用 from
导入 pygame,所以它是覆盖您的鼠标 class。通过将 class 实例名称更改为其他名称来解决此问题。 (例如 myMouse)
Pydude 走在正确的轨道上,但停得太快了。您收到一条非常无用的错误消息,因为当您使用 from blank import *
方法导入 pygame 时导入了 pygame.mouse
(带有一个小的 m),但它应该覆盖那个你有 mouse = Mouse()
。问题是你的缩进是错误的。 running = True
以下的所有内容都需要再次缩进,包括该行。然后,要使 main()
函数变为 运行,您需要在文件末尾包含:
if __name__ == "__main__":
main()
所以当您 运行 代码时发生的事情是它直接跳过 main() 方法(您的代码中永远不会调用它)并且 运行s缩进后的内容返回,从 running = True
开始。当它到达 mouse.display()
你实际上还没有 运行 mouse = Mouse()
行 所以它使用从 [=36 导入的 mouse
=]. mouse
没有 display()
方法,因此出现您的错误消息。
修复该错误后,您的代码中会出现更多错误,但这一更改将使您克服这一错误。下一个至少有一个更有帮助的错误消息,所以你应该能够弄明白。
另外,一些建议:from blank import *
正是因为这个原因而不鼓励。最好是做 import pygame
并引用所有内容,例如 pygame.sprite
(你已经在做......这很奇怪你正在做这两个......)或者做 from pygame import sprite, foo, bar, ...
并明确列出您想要从该模块中获得的每个特定内容。这两种方法可以防止未知的东西使您的命名空间混乱,并且可以防止您收到您无法理解的令人困惑的错误消息。
确保您的当前目录或 PYTHONPATH 中没有另一个 pygame 模块。尝试打印
print(str(pygame.__file__))
检查您是否导入了正确的包。