Feedback messages to user using Tk

Thanks a lot Morton, I'll have a look at this widget when I get home ( :

I had tried something similar to what you suggested with a method, but there was no way of triggering it - i think i needed to perhaps run it as a seperate process...

Thanks again

Gem

···

-----Original Message-----
From: Morton Goldberg [mailto:m_goldberg@ameritech.net]
Sent: 27 September 2006 14:17
To: ruby-talk ML
Subject: Re: Feedback messages to user using Tk...

               *** WARNING ***

This mail has originated outside your organization,
either from an external partner or the Global Internet.
     Keep this in mind if you answer this message.

On Sep 27, 2006, at 8:24 AM, Cameron, Gemma (UK) wrote:

Thanks Morton, however I want the message to change when the
program produces feedback for the user, i.e. the program is zipping
up files, as these files are zipped I should like to display the
incrementing percentage complete. A user will not be clicking a
button each time a file is added, unfortunately; 2,500 files would
probably cause serious RSI!

Do you know how to update the message without a command/bind event?
Another part of the program will be setting the message, like puts.

The fact that I used a button to trigger the change doesn't mean that
a user action is required to effect the change. The btn_action method
is just an ordinary instance method of TestWindow. Any instance
method of the class can do what it does. Also, it can be called by
any object that possesses a reference to the window class.

However, from what you describe above, I think you might be
interested in the Feedback iwidget. Here is an example of its use:

<code>
#! /usr/bin/ruby -w
# Author: Morton Goldberg
#
# Date: September 6, 2006
#
# Progress Indicator 2

require 'tk'
require 'tkextlib/iwidgets'

DEBUG =

begin
    # Build a window containing a progress indicator and a button.
    root = TkRoot.new {title 'Ruby/Tk Progress Indicator'}
    fb = Tk::Iwidgets::Feedback.new(root) {
       steps 20
       labeltext "Click the Button"
       barcolor 'red'
       barheight 20
       troughcolor 'gray90'
    }
    fb.component_widget('trough').
       configure('relief'=>'ridge', 'borderwidth'=>4)
    fb.component_widget('bar').
       configure('relief'=>'sunken', 'borderwidth'=>5)
    fb.pack('fill'=>'x', 'padx'=>15, 'pady'=>10)
    btn = TkButton.new(root) {
       text "Do Something"
       command {btn.action}
    }
    btn.pack('pady'=>10)
    btn.instance_variable_set(:@fb, fb)
    # Starts the timer going when the button is clicked.
    def btn.action
       self.state = 'disable' # Strange -- explicit receiver required
       # Set the timer to trigger at 200 m-sec intervals, once for each
       # progress step.
       $timer = TkTimer.start(200, @fb.steps) {@fb.update}
    end
    fb.instance_variable_set(:@btn, btn)
    # Run on each timer tick.
    def fb.update
       labeltext = "Doing Something ..."
       step
       # loop_rest returns remaining trigger intervals.
       unless $timer.loop_rest > 1
          labeltext = "Click the Button"
          reset
          @btn.state = 'normal'
       end
    end

    # Set initial window geometry; i.e., size and placement.
    win_w, win_h = 300, 160
    # root.minsize(win_w, win_h)
    win_l = (TkWinfo.screenwidth('.') - win_w) / 2
    root.geometry("#{win_w}x#{win_h}+#{win_l}+50")

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

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

    Tk.mainloop
ensure
    puts DEBUG unless DEBUG.empty?
end
</code>

Again, don't get fooled by there being buttons involved in these
examples. The buttons are just artifacts needed to keep the examples
simple.

Regards, Morton

********************************************************************
This email and any attachments are confidential to the intended
recipient and may also be privileged. If you are not the intended
recipient please delete it from your system and notify the sender.
You should not copy it or use it for any purpose nor disclose or
distribute its contents to any other person.
********************************************************************

I hope not. That will complicate things quite a bit. Before you do that I would suggest trying the following:

1. Expose the label by supplying and attribute reader for it in the window class OR provide a public method in the window to update the label (like btn_action but accepting a string argument).
2. Provide your file zipper class with code that either directly updates the label or calls the update method in the window class.
3. Don't call Tk.mainloop in your window class.
4. Create the window object.
5. Create the file zipper object, passing the window object in 'new'.
6. Now call Tk.mainloop

Regards, Morton

···

On Sep 27, 2006, at 9:28 AM, Cameron, Gemma (UK) wrote:

Thanks a lot Morton, I'll have a look at this widget when I get home ( :

I had tried something similar to what you suggested with a method, but there was no way of triggering it - i think i needed to perhaps run it as a seperate process...