1

The problem I am getting is an error when I have entered the sprite, the error states:

Traceback (most recent call last):
  File "C:\Users\User\Documents\Pygame\pygame1.py", line 88, in <module>
    drawGrid()
  File "C:\Users\User\Documents\Pygame\pygame1.py", line 58, in drawGrid
    win.blit (UserSprite, (500, 500))
TypeError: argument 1 must be pygame.Surface, not None

My code:

import pygame #Imports pygame
pygame.init() #Initialises pygame

win = pygame.display.set_mode((700, 700)) #Sets window size

pygame.display.set_caption("T1") #Sets title to T1

SP1R = pygame.image.load('Sprite 1 Red.png')
SP1O = pygame.image.load('Sprite 1 Orange.png')
SP1Y = pygame.image.load('Sprite 1 Yellow.png')
SP1G = pygame.image.load('Sprite 1 Green.png')
SP1B = pygame.image.load('Sprite 1 Blue.png')
SP1PU = pygame.image.load('Sprite 1 Purple.png')
SP1PI = pygame.image.load('Sprite 1 Pink.png')
SP2R = pygame.image.load('Sprite 2 Red.png')
SP2O = pygame.image.load('Sprite 2 Orange.png')
SP2Y = pygame.image.load('Sprite 2 Yellow.png')
SP2G = pygame.image.load('Sprite 2 Green.png')
SP2B = pygame.image.load('Sprite 2 Blue.png')
SP2PU = pygame.image.load('Sprite 2 Purple.png')
SP2PI = pygame.image.load('Sprite 2 Pink.png')
SP3R = pygame.image.load('Sprite 3 Red.png')
SP3O = pygame.image.load('Sprite 3 Orange.png')
SP3Y = pygame.image.load('Sprite 3 Yellow.png')
SP3G = pygame.image.load('Sprite 3 Green.png')
SP3B = pygame.image.load('Sprite 3 Blue.png')
SP3PU = pygame.image.load('Sprite 3 Purple.png')
SP3PI = pygame.image.load('Sprite 3 Pink.png')

x = 300 #x character position set to 50
y = 520 #y character position set to 50
width = 64 #width set to 40
height = 64 #height set to 60
vel = 10 #Character speed set to 5
white = (255, 255, 255)
left = False
right = False
SpriteName = input("""Choose a sprite [...]""")
UserSprite = vars()[SpriteName] if SpriteName in vars() else None
while UserSprite != (SP1R or SP1O or SP1Y or SP1G or SP1B or SP1PU or SP1PI or SP2R or SP2O or SP2Y or SP2G or SP2B or SP2PU or SP3PI or SP3R or SP3O or SP3Y or SP3G or SP3B or SP3PU or SP3PI):
    print ("Nope")
    break


def drawGrid():
    win.fill((0, 0, 0))
    if left:
        win.blit (walkLeft)#draws the following sprites
    elif right:
        win.blit(walkRight)
    pygame.display.update() #updates the display by doing the above
    pygame.draw.line(win, white, [50,50], [50, 600], 5)
    pygame.draw.line(win, white, [50,50], [600, 50], 5)
    pygame.draw.line(win, white, [600,600], [600, 50], 5)
    pygame.draw.line(win, white, [50,600], [600, 600], 5)
    pygame.draw.line(win, white, [50,450], [600, 450], 5)
    pygame.display.update()
    win.blit (UserSprite, (500, 500))

run = True #sets run to true
while run: #While loop for above
    pygame.time.delay(100) #Sets a delay to prevent crashing

    for event in pygame.event.get(): #For loop for event

        if event.type == pygame.QUIT: #If user quits window
            run = False #Do not run

    keys = pygame.key.get_pressed()#Sets keybinds

    if keys[pygame.K_a] and x>55:
        x -= vel
        left = True
        right = False
    elif keys[pygame.K_d] and x <575:
        x += vel
        right = True
        left = False
    if keys[pygame.K_w] and y >455:
        y -= vel
        up = True
        down = False
    elif keys[pygame.K_s] and y <565:
        y += vel
        down = True
        up = False

    drawGrid()
kalehmann
  • 4,821
  • 6
  • 26
  • 36
  • You have a space between the `blit` and the `(`, that would be one place I would start – G. Anderson Mar 18 '19 at 19:21
  • The `while UserSprite != (SPR1...)` is useless, because you `break` the loop in any case. What is the input? Note,you have to input capital letters. – Rabbid76 Mar 18 '19 at 19:22
  • This line `UserSprite = vars()[SpriteName] if SpriteName in vars() else None` is likely assigning `None` to `UserSprite`. Are you sure you did input a valid name? Try to print `vars()` content and see if the sprite is there. – Valentino Mar 18 '19 at 19:23

1 Answers1

2

The loop

while UserSprite != (SPR1...)
    print ("Nope")
    break

is useless, because you break the loop in any case.

Repeat the input until a valid name was read:

UserSprite = None
while UserSprite == None:
    SpriteName = input("""Choose a sprite [...]""")
    UserSprite = vars()[SpriteName] if SpriteName in vars() else None

Note, you have to input capital letters, because all the variable name are in capital letters. The input has to be case sensitive.

Rabbid76
  • 202,892
  • 27
  • 131
  • 174