导入错误:无法从部分初始化的模块 'pygame.font' 导入名称 'Font'(很可能是由于循环导入)

时间:2021-08-01 18:59:08

标签: python python-3.x pygame

我在 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()
 

1 个答案:

答案 0 :(得分:0)

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

您应该这样做:

  • 在本地克隆 pygame 存储库,导航到它。
  • # scraping the foursquare website for the information we want and obtaining the json file as results for i, series in df_income_zip_good.iterrows(): lat = series ['lat'] lng = series ['lng'] town = series ['place'] LIMIT = 100 radius = 1000 url4Sqr = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format( CLIENT_ID, CLIENT_SECRET, VERSION, lat, lng, radius, LIMIT) #export results to json file result4Sqr = requests.get(url4Sqr).json()["response"]['groups'][0]['items'] #print results from call print (result4Sqr)
  • brew install sdl2 sdl2_gfx sdl2_image sdl2_mixer sdl2_net sdl2_ttf
  • brew install Caskroom/cask/xquartz