Python Pygame TypeError: argument 1 must be pygame.Surface, not str

I dont know how to fix them bug. Please help me:( I want the fish to be animated.

import pygame
import random
import os
pygame.init()

class Game:
    def __init__(self):
        super().__init__()
        self.WIDTH, self.HEIGHT = 1100, 700
        self.player = Player()
        self.player_id = self.player.id
        self.main()

    def main(self):
        FPS = 60
        clock = pygame.time.Clock()
        run = True
        while run:

            clock.tick(FPS)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
            self.draw()

            pygame.display.update()
        pygame.quit()

    def draw(self):
        #background
        self.canvas = pygame.display.set_mode((self.WIDTH, self.HEIGHT))
        space_background = pygame.transform.scale(pygame.image.load(os.path.join("Sprites", "background.png")), (self.WIDTH, self.HEIGHT))
        pygame.display.set_caption("Akvarium")
        self.canvas.blit(space_background, (0, 0))

        #player
        self.canvas.blit(self.player.player_fish, (self.player_id.x, self.player_id.y))

        pygame.display.update()
class Sprites:

    def __init__(self, x, y, id_width, id_height):
        self.x, self.y = x, y
        self.id = pygame.Rect(x, y, id_width, id_height)

    def load_sprites(self, file_path):
        sprites = [i for i in os.listdir(file_path)]
        return sprites

class Player(Sprites):
    IDLE = "idle"
    SWIM = "swim"
    LEFT = "left"
    RIGHT = "right"
    #player_img = pygame.image.load(os.path.join("Sprites/Player/idle_left", "tile000.png"))

    def __init__(self):
        x, y = 100, 100
        self.player_width, self.player_height = 85, 60
        super().__init__(x, y, self.player_width, self.player_height)
        self.player_sprites = self.load_all_sprites()
        self.movement = self.IDLE
        self.directions = self.LEFT

        self.tik()


    def load_all_sprites(self):
        sprite_sheed = {self.IDLE: {self.LEFT: [], self.RIGHT: []},
                        self.SWIM: {self.LEFT: [], self.RIGHT: []}}

        sprite_sheed[self.IDLE][self.LEFT] = self.load_sprites("Sprites/Player/idle_left")
        sprite_sheed[self.IDLE][self.RIGHT] = self.load_sprites("Sprites/Player/idle_right")
        sprite_sheed[self.SWIM][self.LEFT] = self.load_sprites("Sprites/Player/swim_left")
        sprite_sheed[self.SWIM][self.RIGHT] = self.load_sprites("Sprites/Player/swim_right")

        return sprite_sheed

    def animation(self, idx):
        idx += 1
        max_idx = len(self.player_sprites[self.movement][self.directions])
        idx = idx % max_idx
        return idx

    def tik(self):
        sprite_idx = self.animation(0)
        self.player_img = self.player_sprites[self.movement][self.directions][int(sprite_idx)]
        self.player_fish = pygame.transform.scale(self.player_img, (self.player_width, self.player_height))

Game()

a mistake is: self.player_fish = pygame.transform.scale(self.player_img, (self.player_width, self.player_height)) TypeError: argument 1 must be pygame.Surface, not str

Python is an interpreted, high-level and general-purpose programming language. Python's design philosophy emphasizes code readability with its notable use of significant whitespace. Its language constructs and object-oriented approach aim to help programmers write clear, logical code for small and large-scale projects.

Upvotes: 1

Views: 157

Answers (1)

Azeem8869786
Azeem8869786

Reputation: 97

#correct code must be
self.player_fish = pygame.transform.scale(self.canvas,(self.player_width,self.player_height))

Here self.canvas is the surface and the size is corrrect..... Hope it helps

Upvotes: 1

Related Questions