June 20, 2018

Graphical Python Programming part 2: Write Your Own Screensaver - page 2

Getting Colorful

  • May 28, 2009
  • By Akkana Peck

See the complete program on page 4


Colors in PyGTK, you may remember from the last article, can be specified either as color names or as Red, Green and Blue hues between 0 and 65535. You can vary your red, green and blue shades gradually, just the same way you did with the line positions. First initialize them:

    r = random.randint(0, 65535)
    g = random.randint(0, 65535)
    b = random.randint(0, 65535)
    colorjump = 2048

Then inside the loop:

        r = clip(r + random.randint(-colorjump, colorjump), 0, 65535)
        g = clip(g + random.randint(-colorjump, colorjump), 0, 65535)
        b = clip(b + random.randint(-colorjump, colorjump), 0, 65535)
        xgc.set_rgb_fg_color(gtk.gdk.Color(r, g, b))

If I also increase the number of steps in the loop to 500, I get something that looks like Figure 4.

figure 4
figure 4


Not bad! But wouldn't it be more fun if it just kept running and changing colors forever, like a screensaver?

That gets a little trickier. Up to now, all the work has been done in the program's expose handler. But while the expose handler is running, the program can't be doing anything else -- like watching for clicks on the Quit button. It might not even have time to draw the screen. So you can't put a long loop, let alone one that will run forever, in handle_expose.

What's the solution? It's called an idle handler.

Most Popular LinuxPlanet Stories

We have made updates to our Privacy Policy to reflect the implementation of the General Data Protection Regulation.