In Python, how can I draw to a pixel on the screen directly?

Matthieu Cartier picture Matthieu Cartier · Sep 28, 2011 · Viewed 28.3k times · Source

I'm wanting to do something like the following:

...
pixel[0,0] = [ 254, 0, 0 ] # Draw R at pixel x0y0
pixel[2,1] = [ 0, 254, 0 ] # Draw G at pixel x2y1
pixel[4,2] = [ 0, 0, 254 ] # Draw B at pixel x4y2
...

I hope to display many different configurations of pixels and colours in a short space of time -- writing to an intermediary file would be too expensive.

How should I best go about achieving this goal in Python?

Answer

hamstergene picture hamstergene · Sep 28, 2011

Direct answer:

This can only be done with OS-specific APIs. Some OSes does not allow changing pixels on the screen directly.

On Windows, you can use pywin32 libraries to get screen's device context with dc = GetDC(0) call, then paint pixels with SetPixel(dc, x, y, color).

import win32gui
import win32api

dc = win32gui.GetDC(0)
red = win32api.RGB(255, 0, 0)
win32gui.SetPixel(dc, 0, 0, red)  # draw red at 0,0

Of course, what you paint this way can be erased at any moment.

Right answer:

Painting pixel by pixel is the slowest way to paint something. For example, on Windows, creating an image in memory then painting it in one operation is order of magnitude faster than painting with SetPixel.

If you need speed, use some user interface library for python, for example, Tkinter module or PyQt. Create a window and image in memory, then paint the image on the window. If you need to manipulate pixels, manipulate them in the image and repaint every time.