# Re: Feedback messages to user using Tk

**URL:** <https://www.ruby-forum.com/t/re-feedback-messages-to-user-using-tk/70199>\
**Category:** Ruby\
**Created:** [September 27, 2006, 2:24pm UTC](https://www.ruby-forum.com/t/re-feedback-messages-to-user-using-tk/70199 "2006-09-27T14:24:47Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![CameronS\_Gemma\_SUK](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/45deac/32.png) [@CameronS\_Gemma\_SUK](https://www.ruby-forum.com/u/CameronS_Gemma_SUK)\
**Post date:** [September 27, 2006, 2:24pm UTC](https://www.ruby-forum.com/t/re-feedback-messages-to-user-using-tk/70199/1 "2006-09-27T14:24:47Z")

</div>

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.

Ta

Gem

---

<div class="post-metadata">

**Author:** ![CameronS\_Gemma\_SUK](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/45deac/32.png) [@CameronS\_Gemma\_SUK](https://www.ruby-forum.com/u/CameronS_Gemma_SUK)\
**Post date:** [September 27, 2006, 3:18pm UTC](https://www.ruby-forum.com/t/re-feedback-messages-to-user-using-tk/70199/2 "2006-09-27T15:18:54Z")

</div>

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:

`
#! /usr/bin/ruby -w
# Author: Morton G.
#
# 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
`

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

---

<div class="post-metadata">

**Author:** ![CameronS\_Gemma\_SUK](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/45deac/32.png) [@CameronS\_Gemma\_SUK](https://www.ruby-forum.com/u/CameronS_Gemma_SUK)\
**Post date:** [September 27, 2006, 3:27pm UTC](https://www.ruby-forum.com/t/re-feedback-messages-to-user-using-tk/70199/3 "2006-09-27T15:27:00Z")

</div>

Morton G. wrote:

> 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:

Thanks for both of the examples. It will take me a while to pick my way  
through the code and understand it properly. But I ran both and read  
through once so I think there is already things I can use.

Thanks a lot. Im finding this project very slow going so examples like  
this help a lot!

Mary
