【问题标题】:ImportError: cannot import name 'Font' from partially initialized module 'pygame.font' (most likely due to a circular import)ImportError:无法从部分初始化的模块'pygame.font'导入名称'Font'(很可能是由于循环导入)
【发布时间】:2021-08-01 18:59:08
【问题描述】:

我在我的 Mac M1 上玩 Pygame。发生的事情是 Pygame 不允许我使用字体模块。查看一些 GitHub 讨论,我尝试使用 brew 安装 sdl2 库,但没有任何效果。我该如何解决这个问题?

P.S 虽然代码没有错误,但我还是会提供。


import pygame
from pygame.draw import circle,rect
from pygame.locals import *
from pygame.font import SysFont
import random
pygame.init()

width = 500
height = 900
font = pygame.font.SysFont('arial',50)
screen = pygame.display.set_mode((width,height))
enemies = pygame.sprite.Group()
players = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
plasers = pygame.sprite.Group()
alasers = pygame.sprite.Group()
ENEMYLASER = pygame.USEREVENT+1
pygame.time.set_timer(ENEMYLASER,1000)
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player,self).__init__()
        self.surf = pygame.Surface((30,40))
        self.surf.fill((255,0,0))
        self.rect = self.surf.get_rect()
        self.speed = 5
        self.rect.center = (width//2,800)
    def update(self,pressed_keys):
        if pressed_keys[K_a]:
            self.rect.move_ip(-self.speed,0)
        if pressed_keys[K_d]:
            self.rect.move_ip(self.speed,0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(self.speed,0)
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-self.speed,0)
        if self.rect.right >width:
            self.rect.right = width
        if self.rect.left<0:
            self.rect.left = 0
        if pygame.sprite.spritecollideany(self,alasers):
            players.remove(self)
            all_sprites.remove(self)
            self.kill()
        
class Alien(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super(Alien,self).__init__()
        self.surf=pygame.Surface((50,50))
        
        self.rect = self.surf.get_rect()
        self.rect.center=(x,y)
        self.surf.fill((0,255,0))
    def update(self):
        if pygame.sprite.spritecollideany(self,plasers):
            enemies.remove(self)
            all_sprites.remove(self)
            self.kill()
class PLaser(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super(PLaser,self).__init__()
        self.surf = pygame.Surface((10,20))
        self.surf.fill((0,0,255))
        self.rect = self.surf.get_rect()
        self.rect.center=(x,y)
        self.speed = -5
        self.visibility = True
    def update(self):
        self.rect.move_ip(0,self.speed)
        if not self.visibility:
            plasers.remove(self)
            all_sprites.remove(self)
            self.kill()
        if pygame.sprite.spritecollideany(self,enemies):
            
            self.visibility= False
class ALaser(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super(ALaser,self).__init__()
        self.surf = pygame.Surface((10,20))
        self.surf.fill((255,255,0))
        self.rect = self.surf.get_rect()
        self.rect.center=(x,y)
        self.speed = 5
        self.visibility = True
    def update(self):
        self.rect.move_ip(0,self.speed)
        if not self.visibility:
            alasers.remove(self)
            all_sprites.remove(self)
            self.kill()
        if pygame.sprite.spritecollideany(self,players):
            
            self.visibility= False

        
player = Player()


players.add(player)
all_sprites.add(player)
for x in range(3):
    for y in range(3):
        alien = Alien(x*100+100,y*100+100)
        enemies.add(alien)
        all_sprites.add(alien)
def won():
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                running = False
        text = font.render("You won",True,(255,0,0))
        text_rect = text.get_rect()
        text_rect.center = (width//2,height//2)
        screen.blit(text,text_rect)
        pygame.display.flip()
def lost():
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                running = False
        text = font.render("You lost",True,(255,0,0))
        text_rect = text.get_rect()
        text_rect.center = (width//2,height//2)
        screen.blit(text,text_rect)
        pygame.display.flip()
        

running=True

while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running=False
        if event.type == KEYDOWN:
            if event.key == K_SPACE:
                laser = PLaser(player.rect.centerx,player.rect.centery)
                plasers.add(laser)
                all_sprites.add(laser)
        if event.type == ENEMYLASER:
            enemy = random.choice(enemies.sprites())
            laser= ALaser(enemy.rect.centerx,enemy.rect.centery)
            alasers.add(laser)
            all_sprites.add(laser)
    screen.fill((0,0,0))
    pressed_keys= pygame.key.get_pressed()
    player.update(pressed_keys)
    for entity in plasers:
        entity.update()
    for entity in alasers:
        entity.update()
    for entity in enemies:
        entity.update()
    for entity in all_sprites:
        screen.blit(entity.surf,entity.rect)
    if len(players.sprites()) == 0:
        running=False
        lost()
    if len(enemies.sprites()) == 0:
        running=False
        won()
    pygame.display.flip()

pygame.quit()
 

【问题讨论】:

  • 请显示回溯。没有它,就很难确定需要修复的循环导入。请理解循环导入错误。

标签: python python-3.x pygame


【解决方案1】:

我相信这个问题已经在 Github 上的当前 pygame main 中得到修复,通过这个拉取请求:https://github.com/pygame/pygame/pull/2636

这是你应该做的:

  • 在本地克隆 pygame 存储库,导航到它。
  • brew install sdl2 sdl2_gfx sdl2_image sdl2_mixer sdl2_net sdl2_ttf
  • brew install Caskroom/cask/xquartz
  • pip3 install .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-24
    • 2022-06-22
    • 2022-01-08
    • 2020-05-20
    • 2021-11-28
    • 1970-01-01
    • 2023-02-12
    • 2021-09-22
    相关资源
    最近更新 更多