ColorWall
Project[edit]
Program graphical effects for a ColorWall.
Goals[edit]
- Have fun experimenting with and creating graphical effects.
- Practice using functions and classes.
- Get experience with graphics programming using the Tkinter GUI toolkit.
- Practice reading other people's code.
Download source code[edit]
- Install git if you have not already done so.
- Clone source
git clone git@github.com:jesstess/ColorWall.git
Project steps[edit]
1. Learn about HSV values[edit]
Run the ColorWall effects again with
python run.py
The names of the effects are printed to the terminal as they are run. Pay particular attention to the first 4 effects:
- SolidColorTest
- HueTest
- SaturationTest
- ValueTest
In all of these effects, a tuple hsv
containing the hue, saturation, and value describing a color are passed to self.wall.set_pixel
to change the color of a single pixel on the wall.
What are the differences between these tests? Given these difference and how they are expressed visually, how does varying hue, saturation, or value change a color?
Check your understanding: what saturation and value would you guess firetruck red have?
Step 1 resources:
- Using tuples: http://www.afterhoursprogramming.com/tutorial/Python/Tuples/
-
Using the
range
function to produce a sequence of numbers: http://docs.python.org/tutorial/controlflow.html#the-range-function -
Using the
time
module to sleep (do nothing for a bit) inside your program: http://docs.python.org/library/time.html
2. Examine Effect
and the interface its subclasses provide[edit]
All of the effects inherit from the Effect
class. Examine this class and its __init__
and run
methods.
What is the purpose of the __init__
method?
What is the purpose of the run
method?
Open up run.py
and look at this chunk of code at the bottom of the file:
for effect in effects_to_run: new_effect = effect(wall) print new_effect.__class__.__name__ new_effect.run()
effects.py
exports an Effects
list at the bottom of the file. run.py
goes through every effect in that list, creates a new instance of the effect, and invokes its run
method.
Check your understanding: what would happen if you added an effect to the Effects
list that didn't implement a run
method? (Try it!)
Step 2 resources:
- Creating and using Python functions: http://www.sthurlow.com/python/lesson05/
- Creating and using Python classes: http://www.sthurlow.com/python/lesson08/
-
A discussion on
__init__
andself
: http://stackoverflow.com/questions/625083/python-init-and-self-what-do-they-do
3. Examine the nested for
loop in SolidColorTest
[edit]
for x in range(self.wall.width): for y in range(self.wall.height): self.wall.set_pixel(x, y, hsv)
This code loops over every pixel in the ColorWall, setting the pixel to a particular hsv
value. After that for
loop is over, self.wall.draw()
updates the display.
Check your understanding: what would happen if you moved the self.wall.draw()
to inside the inner for
loop, just under self.wall.set_pixel(x, y, hsv)
in SaturationTest
? (Try it!)
Tip: you can run individual tests by passing their names as command line arguments (argument -e or --effects) to run.py
. For example, if you only wanted to run SaturationTest
, you could:
python run.py -e SaturationTest
4. Implement a new effect called RainbowTest
[edit]
It should run for 5 seconds, cycling through the colors in the rainbow, pausing for a moment at each color.
Remember to add your effect to the Effect
list at the bottom of effects.py
!
Test your new effect with
python run.py -e RainbowTest
5. Play with the randomness in Twinkle
[edit]
Walk through Twinkle
. Find explanations of the random.randint
and random.uniform
functions in the online documentation at http://docs.python.org/library/random.html.
Experiment with these functions at a Python prompt:
import random random.randint(0, 1) random.randint(0, 5) random.uniform(-1, 1)
Then experiment with the numbers that make up the hue and re-run the effect:
python run.py -e Twinkle
Challenge: make Twinkle
twinkle with shades of blue.
6. Implement a new effect that involves randomness![edit]
Remember to add your effect to the Effect
list at the bottom of effects.py
.
Bonus exercises[edit]
1. Checkerboard[edit]
Find and change the colors used in the Checkerboards
effect, and re-run the effect:
python run.py -e Checkerboards
Then change the line
if (x + y + i) % 2 == 0:
to
if (x + y + i) % 3 == 0:
re-run the effect, and see what changed.
What other patterns can you create by tweaking the math for this effect?
2. Matrix[edit]
Find and change the color of the columns in the Matrix
effect, and re-run the effect:
python run.py -e Matrix
Each column that we see on the wall corresponds to a Column
object. Add some randomness to the color used by each column (the variable whose value you changed above) using the random.random
function, re-run the effect, and see what happens.
3. Write more of your own effects![edit]
You have color, time, randomness, letters, and more at your disposal. Go nuts!
Congratulations![edit]
You've read, modified, and added code to a software project that makes art out of pixels. Keep practicing!