[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Re: Feedback messages to user using Tk...

Morton Goldberg

9/27/2006 11:53:00 AM


On Sep 27, 2006, at 4:26 AM, Cameron, Gemma (UK) wrote:

>
> Hi all!
>
> If anyone is very familiar with Tk I would be very grateful for a
> few pointers.
>
> Basically I'm looking to feedback my program's output to the user
> in a GUI (Tk Label) rather than printing to the console (which it
> currently does). This information would simply be a string to let
> the user know what's going on and maybe even what percentage of the
> work has been done. I don't want a command/bound event to drive
> this - I simply want to send a message to a method which will
> update the Tk Label dynamically.
>
> I envision the calling the class like this:
>
> @output = GraphicalOutput.new
> @output.message("Now moving files....")
>
> to replace the current:
> p "Now moving files..."
>
> Is this possible with Tk? I've been looking for days now and
> haven't found much. I know how to use the TkLabel.configure
> ('text'=>..) etc. to update the text, however just calling this
> when the mainloop is running does not seem to dynamically update
> the label. I've even got the stopwatch example going from the
> O'Reilly cookbook.
>
> Am I using the wrong approach and/or mentality for this problem?!

Ruby/Tk makes it easy to do what you want. You don't need to bother
with low-level methods like 'configure' -- Ruby/Tk provides more
runbyish ways -- in this case access methods for a label's text. I
hope the following small example will help you.

<code>
#! /usr/bin/ruby -w

require 'tk'

DEBUG = []

MESSAGES = [
"This is the first message",
"This is another message",
"This is the third message",
"Are you getting bored?"
]

class TestWindow
# Each time the button is clicked on, the label shows a new message.
def btn_action
@indx = (@indx + 1) % MESSAGES.length
@lbl.text = MESSAGES[@indx]
end

def initialize
begin
@indx = 0

# Set up the widgets.
root = TkRoot.new { title 'Ruby Tk' }
@lbl = TkLabel.new { text MESSAGES.first }
@btn = TkButton.new { text "Next Message" }
@btn.command = lambda { btn_action }
@lbl.pack(:pady => 20)
@btn.pack(:pady => 20)

# Set initial window geometry; i.e., size and placement.
win_w, win_h = 300, 135
# root.minsize(win_w, win_h)
win_x = (root.winfo_screenwidth - win_w) / 2
root.geometry("#{win_w}x#{win_h}+#{win_x}+50")

# Set resize permissions.
root.resizable(false, false)

# Make Cmnd+Q work as expected (running on OS X).
root.bind('Command-q') {Tk.root.destroy}

Tk.mainloop
ensure
puts DEBUG unless DEBUG.empty?
end
end
end

TestWindow.new
</code>

Regards, Morton