[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Ruby/Tk - simple task that I'm srtuck

Valen Onish

6/26/2007 11:44:00 AM

I have:
1. $lb_1 = TkLabel.new(root){..} - label
2. bt_toss=TkButton.new(root){..} - button

I want when I press the button: 1. label's background is changed
to blue
2. display changed label's
background
3. sleep(0.5)
4. label's background is changed
to green
5. display changed label's
background

but I see only the last colour.

here the code:

require 'tk'

root = TkRoot.new { title "Ruby/Tk Example" }

$lb_1 = TkLabel.new(root){
background "red"
foreground "blue"
text "Your area"
font "system,12"
place('relx'=>0.4, 'rely'=>0.08)
}

bt_toss=TkButton.new(root){
text "Toss"
command proc{change_colour}
place('relx'=>0.2, 'rely'=>0.78)
}

def change_colour
$lb_1.configure('background'=>'blue')
sleep(0.5)
$lb_1.configure('background'=>'green')
sleep(0.5)
$lb_1.configure('background'=>'gray')

end

Tk.mainloop

--
Posted via http://www.ruby-....

4 Answers

Morton Goldberg

6/26/2007 4:28:00 PM

0

On Jun 26, 2007, at 7:44 AM, Valen Onish wrote:

> I have:
> 1. $lb_1 = TkLabel.new(root){..} - label
> 2. bt_toss=TkButton.new(root){..} - button
>
> I want when I press the button: 1. label's background is
> changed to blue
> 2. display changed label's
> background
> 3. sleep(0.5)
> 4. label's background is
> changed to green
> 5. display changed label's
> background
>
> but I see only the last colour.

You only see the last color because you don't call update on the
label widget after you change the background color.

> here the code:
>
> require 'tk'
>
> root = TkRoot.new { title "Ruby/Tk Example" }
>
> $lb_1 = TkLabel.new(root){
> background "red"
> foreground "blue"
> text "Your area"
> font "system,12"
> place('relx'=>0.4, 'rely'=>0.08)
> }
>
> bt_toss=TkButton.new(root){
> text "Toss"
> command proc{change_colour}
> place('relx'=>0.2, 'rely'=>0.78)
> }
>
> def change_colour
> $lb_1.configure('background'=>'blue')
> sleep(0.5)
> $lb_1.configure('background'=>'green')
> sleep(0.5)
> $lb_1.configure('background'=>'gray')
>
> end
>
> Tk.mainloop

I strongly urge you to avoid using global variables to solve a
scoping problem when there are better ways to solve the problem. I've
taken the liberty to show you one way to avoid using a global name
for the label widget. And I have Ruby-ized your code in a couple of
other small ways.

<code>
require 'tk'

ZZZ = 2.0 # longer delay makes color changes easier to see

root = TkRoot.new { title "Ruby/Tk Example" }

lbl = TkLabel.new(root) {
background "red"
foreground "blue"
text "Your area"
# bigger font just to make text easier to see
font "system, 24"
place('relx' => 0.2, 'rely' => 0.08)
}

def lbl.change_colour
# this is a singleton method; self is now the TkLabel object
# also Ruby/Tk will build Tk configure calls for you
background('blue')
update # this makes the color change happen on the screen
sleep(ZZZ)
background('green')
update
sleep(ZZZ)
background('gray')
end

# The local variable 'lbl' is visible in the black because
# the block is a closure.
callback = lambda { lbl.change_colour }

TkButton.new(root) {
text "Toss"
command callback
place('relx' => 0.35, 'rely' => 0.8)
}

Tk.mainloop
</code>

Regards, Morton

Hidetoshi NAGAI

6/26/2007 4:55:00 PM

0

Valen Onish

6/26/2007 6:34:00 PM

0

Thanks Morton! You really helped me.

--
Posted via http://www.ruby-....

Valen Onish

6/26/2007 6:37:00 PM

0

Thanks Hidetoshi! I appreciate your help.

--
Posted via http://www.ruby-....