Unfortunately, there isn’t a single function you can call that will set a single pixel to a color (unless you call
pygame.draw.line() with the same start and end point). The Pygame framework needs to run some code behind the scenes before and after drawing to a Surface object. If it had to do this for every single pixel you wanted to set, your program would run much slower. (By my quick testing, drawing pixels this way is two or three times slower.)
Instead, you should create a
pygame.PixelArray object (we’ll call them PixelArray objects for short) of a Surface object and then set individual pixels. Creating a PixelArray object of a Surface object will "lock" the Surface object. While a Surface object is locked, the drawing functions can still be called on it, but it cannot have images like PNG or JPG images drawn on it with the
blit() method. (The
blit() method is explained later in this chapter.)
If you want to see if a Surface object is locked, the
get_locked() Surface method will return
True if it is locked and
False if it is not.
The PixelArray object that is returned from
pygame.PixelArray() can have individual pixels set by accessing them with two indexes. For example, line 28’s
pixObj = BLACK will set the pixel at X coordinate 480 and Y coordinate 380 to be black (remember that the
BLACK variable stores the color tuple
(0, 0, 0)).
To tell Pygame that you are finished drawing individual pixels, delete the PixelArray object with a
del statement. This is what line 33 does. Deleting the PixelArray object will "unlock" the Surface object so that you can once again draw images on it. If you forget to delete the PixelArray object, the next time you try to blit (that is, draw) an image to the Surface the program will raise an error that says, "
pygame.error: Surfaces must not be locked during blit".