Boston Python workshop/Saturday/ColorWall: Difference between revisions
imported>Jesstess (→Goals) |
imported>Jesstess No edit summary |
||
Line 83: | Line 83: | ||
<pre>python run.py SaturationTest</pre> |
<pre>python run.py SaturationTest</pre> |
||
=== 4. Implement a new effect called <code>RainbowTest</code> === |
|||
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 <code>Effect</code> list at the bottom of <code>effects.py</code>! |
|||
Test your new effect with |
|||
<pre>python run.py RainbowTest</pre> |
|||
Revision as of 14:57, 5 July 2012
Project
Program graphical effects for a ColorWall using the Tkinter GUI toolkit.
Goals
- Have fun experiment 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.
Project setup
Download and un-archive the ColorWall project skeleton code
Un-archiving will produce a ColorWall
folder containing several Python files, including: run.py, effects.py, and advanced_effects.py.
Test your setup
From a command prompt, navigate to the ColorWall
directory and run
python run.py -a
You should see a window pop up and start cycling through colorful effects. If you don't, let a staff member know so you can debug this together.
Project steps
1. Learn about HSV values
Run the ColorWall effects again with
python run.py -a
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?
2. Examine Effect
and the interface its subclasses provide
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 and 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!)
3. Examine the nested for
loop in SolidColorTest
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 to run.py
. For example, if you only wanted to run SaturationTest
, you could:
python run.py SaturationTest
4. Implement a new effect called RainbowTest
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 RainbowTest
Suggested exercises
-
Find and change the colors used in the
Checkerboards
effect, and re-run the effect:python run.py 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.
-
Find and change the color of the columns in the
Matrix
effect, and re-run the effect:python run.py 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 therandom.random
function, re-run the effect, and see what happens. -
Walk through
Twinkle
. Find explanations of therandom.randint
andrandom.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 Twinkle
- Write your own effects!
Some Useful Links
If you choose to use HSV colors you define instead of the dictionary, you may find some of the following useful: