@Vanushka1102

Ошибка в Pygame: AttributeError: 'str' object has no attribute 'image'. Что делать?

Пишу игру Лабиринт на PyGame, вот код:
import pygame
import random
import os
import time

# настройка папки ассетов
game_folder = os.path.dirname(__file__)
img_folder = os.path.join(game_folder, 'img')
player_img = pygame.image.load(os.path.join(img_folder, '/Users/polina/Desktop/PyGame/img/кіт3.png'))
player_img2 = pygame.image.load('/Users/polina/Desktop/PyGame/img/bg.png')
WIDTH = 2000
HEIGHT = 900
FPS = 30

# Задаем цвета
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)


class Player(pygame.sprite.Sprite):     
    
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = player_img
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)
    def update(self):
        self.speedx = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx -= 8
        if keystate[pygame.K_RIGHT]:
            self.speedx += 8
        if keystate[pygame.K_UP]:
            self.rect.y -= 8
        if keystate[pygame.K_DOWN]:
            self.rect.y += 8
        self.rect.x += self.speedx
class Wall(pygame.sprite.Sprite):
    def init(self):
        pygame.sprite.Sprite.__init__(self)
        self.fill(BLACK)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)
    def create(self,colour,x,y):
        self.image.fill(colour)
        self.rect.y = y
        self.rect.x = x   
        self.rect.width = 10
        self.rect.height = 10
# Создаем игру и окно
        
pygame.init()
pygame.mixer.init()
Wall.create("",GREEN,0,0)
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Test Game ")
clock = pygame.time.Clock()
all_sprites = pygame.sprite.Group()
player = Player()
pl = Wall()
all_sprites.add(player)
all_sprites.add(pl)

# Цикл игры
running = True
while running:
    # Держим цикл на правильной скорости
    clock.tick(FPS)
    # Ввод процесса (события)
    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False

    # Обновление
    all_sprites.update()
    
    # Рендеринг
    screen.fill(RED)
    screen.blit(player_img2, (0,0))
    all_sprites.draw(screen)
    # После отрисовки всего, переворачиваем экран
    pygame.display.flip()

pygame.quit()

Ошибка: Traceback (most recent call last):
  File "/Users/polina/Documents/PyGameTest1.py", line 58, in <module>
    Wall.create("", GREEN, 0, 0)
  File "/Users/polina/Documents/PyGameTest1.py", line 49, in create
    self.image.fill(colour)
AttributeError: 'str' object has no attribute 'image'
Что делать? Какие дальше могут быть ошибки? Как их исправить?
  • Вопрос задан
  • 649 просмотров
Решения вопроса 1
Ternick
@Ternick
Ошибка возникает в методе create класса Wall:
class Wall(pygame.sprite.Sprite):
    def init(self):
        pygame.sprite.Sprite.__init__(self)
        self.fill(BLACK)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)
    def create(self,colour,x,y):
        self.image.fill(colour) #Тута
        self.rect.y = y
        self.rect.x = x   
        self.rect.width = 10
        self.rect.height = 10

Из-за этого вызова:
Wall.create("",GREEN,0,0)
Потому, что кто-то полез туда, где ничего не понимает.
self это не просто параметр, а куда более важнее, его не нужно передавать из вне. {self нужен для работы с внутренними переменными класса}

Какие дальше ошибки посыплются - не знаю, я не ванга, а обычный человек.
Решение:
Идти глянуть хотя бы что-такое self и зачем он нужен.
Заменить вызов метода create класса Wall, на этот Wall.create(GREEN,0,0).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы