为什么我无法同时将variable
,game.py
中的WIDTH, HEIGHT
导入player.py
和enemy.py
?我只能将它导入一个文件。
当我在两个文件上导入它时 我收到以下错误:
from game import HEIGHT, WIDTH
ImportError: cannot import name HEIGHT
#!/usr/bin/python
VERSION = "0.1"
import os, sys, player, enemy
from os import path
try:
import pygame
from pygame.locals import *
except ImportError, err:
print 'Could not load module %s' % (err)
sys.exit(2)
# main variables
WIDTH, HEIGHT, FPS, BGIMG = 700, 400, 30, 'FlappyTrollbg.jpg'
# initialize game
pygame.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("FlappyTroll - Python2.7")
# background
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((255,255,255))
img_dir = path.join(path.dirname(__file__), 'img')
class Background(pygame.sprite.Sprite):
def __init__(self, image_file, location):
pygame.sprite.Sprite.__init__(self)
self.width = WIDTH
self.height = HEIGHT
self.image = pygame.image.load(path.join(img_dir,image_file)).convert_alpha()
self.image = pygame.transform.scale(self.image,(self.width,self.height))
self.rect = self.image.get_rect()
#self.rect.left, self.rect.top = location
self.rect.x, self.rect.y = location
self.speedx = 5
def update(self):
self.rect.x -= self.speedx
if self.rect.x <= -WIDTH:
self.rect.x = WIDTH
# blitting
screen.blit(background,(0,0))
pygame.display.flip()
# clock for FPS settings
clock = pygame.time.Clock()
def main():
all_sprites = pygame.sprite.Group()
bgs = pygame.sprite.Group()
creature = pygame.sprite.Group()
bgs.add(Background(BGIMG, [0,0]))
bgs.add(Background(BGIMG, [WIDTH,0]))
creature.add(player.FlappyTroll())
for i in range(0,4):
all_sprites.add(enemy.TrollEnemy())
# variable for main loop
running = True
# init umbrella
# event loop
while running:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# gets_hit = pygame.sprite.spritecollide(umb, all_sprites, True)
# if gets_hit:
# newDrop()
screen.fill([255, 255, 255])
# update
bgs.update()
all_sprites.update()
creature.update()
# draw
bgs.draw(screen)
all_sprites.draw(screen)
creature.draw(screen)
# flip the table
pygame.display.flip()
pygame.quit()
if __name__ == '__main__':
main()
import pygame
from pygame.locals import *
from os import path
from random import randint
from game import HEIGHT, WIDTH
img_dir = path.join(path.dirname(__file__), 'img')
class FlappyTroll(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.width = 64
self.height = 64
self.image = pygame.image.load(path.join(img_dir,"flappytroll.png")).convert_alpha()
self.image = pygame.transform.scale(self.image,(self.width,self.height))
self.rect = self.image.get_rect()
self.rect.x = self.width*2
self.rect.y = HEIGHT/2-self.height
self.speedy = 5
def update(self):
pass
# keys = pygame.key.get_pressed()
# if(keys[pygame.K_SPACE]):
# self.rect.y -= self.speedy*2
# else:
# self.rect.y += self.speedy
import pygame
from pygame.locals import *
from os import path
from random import randint
from game import HEIGHT, WIDTH
img_dir = path.join(path.dirname(__file__), 'img')
class TrollEnemy(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.width = 64
self.height = 64
self.image = pygame.image.load(path.join(img_dir,"TrollEnemy.png")).convert_alpha()
self.image = pygame.transform.scale(self.image,(self.width,self.height))
self.rect = self.image.get_rect()
self.rect.x = WIDTH+self.width
self.rect.y = randint(self.height,HEIGHT-self.height)
self.speedy = 5
def update(self):
self.rect.x -= speedy
答案 0 :(得分:2)
好的,现在我看到你真的有循环导入。您的game.py
尝试导入player.py
和enemy.py
。当你从game.py导入变量时,python导入game.py
和creates references in the current namespace to the given objects所以game.py
导入player.py
,导入game.py
。它被称为&#34;循环导入&#34;。
答案 1 :(得分:1)
正如user2357112所提到的,您有一个循环导入问题。我假设你想运行game.py.在第三行中导入播放器,因此Python会解析该文件。当解析器到达player.py的第五行时,它应该导入game.py.这是你的循环导入。
要解决此问题,您可以在单独的.py(简单)或.ini(更复杂但也更清晰)文件中定义主变量,并从那里导入它们。
另一个选择是不导入主变量并将它们传递给需要它们的每个函数。为此,您可以将它们分组到一个字典中,这样您只能传递一个对象。