This is an old revision of the document!
Using pre-fabricated images instead of painting all images yourself with the pygame.draw - functions comes very handy. This example shows you how to load images into pygame. Note that in this example, the images must be in the same folder as the python program ! In this example, if pygame can not find the images, it will print an error message and use the image-drawing methods from the previous code example.
This is done using the try: except: method.
try: #do something risky that may not work like loading files #... except: #do that if an error occurs inside the try block #... # continue here if no error
Also see the official documentation:
Put those 2 graphic files in the same folder as part2step008-loading-image.py to make the program run correctly. If one or both of those files are not found you will see a brown and a blue circle instead:
|filename||preview / note||file must be in folder||source / license|
|babytux.png||same folder as program||wikimedia commons|
left-click to zoom to original size, then right-click to download
|same folder as program||Horst JENS / public domain|
|part2step008.tar.gz||part2step008 all files except the source code in a zipped package|
# -*- coding: utf-8 -*- """ part2step008-loading-image.py loading images from harddisk and using convert_alpha() This program try to load 2 image files from the harddisk. Both files must be in the same folder as the program itself. If the image files are not found, images are created by code instead and an error message is printed. Note that convert_alpha() is only necessary when the loaded image had a transparent color. Some .png and .gif files have this, but never .jpg files. """ import pygame pygame.init() screen=pygame.display.set_mode((640,480)) # try out larger values and see what happens ! try: background = pygame.image.load("background640x480_a.jpg") except: print("Error: the image background640x480_a.jpg is not in this folder") background = pygame.Surface(screen.get_size()) # create a pygame Surface background.fill((255,255,255)) # fill the background white pygame.draw.circle(background, (50,50,0), (300,250), 200) # draw circle try: ball = pygame.image.load("babytux.png") except: print("Error: the image babytux.png is not in this folder") ball = pygame.Surface((50,50)) #create a new black surface ball.set_colorkey((0,0,0)) pygame.draw.circle(ball, (0,0,255), (25,25),25) # paint blue circle #finally: background = background.convert() # jpg can not have transparency ball = ball.convert_alpha() # png image has transparent color ballx, bally = 550, 240 # start position of ball surface dx, dy = 60, 60 # ball speed in pixel per second ! screen.blit(background, (0,0)) # blit background on screen (overwriting all) screen.blit(ball, (ballx, bally)) # blit the ball shape clock = pygame.time.Clock() # create pygame clock object mainloop = True FPS = 60 # desired max. framerate in frames per second. while mainloop: milliseconds = clock.tick(FPS) # milliseconds passed since last frame seconds = milliseconds / 1000.0 # seconds passed since last frame for event in pygame.event.get(): if event.type == pygame.QUIT: mainloop = False # pygame window closed by user elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: mainloop = False # user pressed ESC pygame.display.set_caption("[FPS]: %.2f X:%.1f Y:%.1f Speed" " [pixel/sec] dx:%.2f dy:%.2f" % (clock.get_fps(), ballx, bally, dx, dy)) # only blit the part of the background where the ball was (cleanrect) dirtyrect = background.subsurface((round(ballx,0), round(bally,0), ball.get_width(), ball.get_height())) # comment out the next line for a funny effect ! screen.blit(dirtyrect, (round(ballx,0), round(bally,0))) #calculate new center of ball ballx += dx * seconds # time based movement bally += dy * seconds # bounce ball if out of screen if ballx < 0: ballx = 0 dx *= -1 elif ballx + ball.get_width() > screen.get_width(): ballx = screen.get_width() - ball.get_width() dx *= -1 if bally < 0: bally = 0 dy *= -1 elif bally + ball.get_height() > screen.get_height(): bally = screen.get_height() - ball.get_height() dy *= -1 # paint the ball screen.blit(ball, (round(ballx,0), round(bally,0))) pygame.display.flip() # flip the screen 30 times a second # flip the screen 30 (or FPS) times a second