in reply to More Perl/Tk help.

Because you passed $colour by value, as opposed to $rightwrong, which was passed by reference. In the former case the method gets a copy of the state the variable had at invocation time. Obviously then you can change the variable all you like - it won't change the copy. To do what you wanted, you need to reconfigure the widget.
# ... my $rw = $mw->Label(-textvariable => \$rightwrong, -foreground => $colour)->pack(-side=> 'bottom'); # ... if ($answer == $guess) { #count correct answers $correct++; $rightwrong = 'Correct!'; $rw->configure(-foreground => 'green'); }else{ $rightwrong = 'Wrong!'; $rw->configure(-foreground => 'red'); } # ...
(If I am allowed a personal comment, I really hate Tk's way of using pass-by-reference to keep track of changes. It leads to spaghetti code real quick like.)

Makeshifts last the longest.