# Tk StatusBar help

**URL:** <https://www.ruby-forum.com/t/tk-statusbar-help/116466>\
**Category:** Ruby\
**Created:** [October 5, 2007, 8:30pm UTC](https://www.ruby-forum.com/t/tk-statusbar-help/116466 "2007-10-05T20:30:57Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![jayson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/aeb1de/32.png) [@jayson](https://www.ruby-forum.com/u/jayson)\
**Post date:** [October 5, 2007, 8:30pm UTC](https://www.ruby-forum.com/t/tk-statusbar-help/116466/1 "2007-10-05T20:30:57Z")

</div>

Is anyone familiar at all with Ruby Tk’s StatusBar. I have not been  
able to find out how to implement a StatusBar in my Ruby code. Could  
someone lend me a hand?

Thanks  
Jayson

---

<div class="post-metadata">

**Author:** ![jayson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/aeb1de/32.png) [@jayson](https://www.ruby-forum.com/u/jayson)\
**Post date:** [October 5, 2007, 8:58pm UTC](https://www.ruby-forum.com/t/tk-statusbar-help/116466/2 "2007-10-05T20:58:28Z")

</div>

unsubscribe

---

<div class="post-metadata">

**Author:** ![jayson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/aeb1de/32.png) [@jayson](https://www.ruby-forum.com/u/jayson)\
**Post date:** [October 5, 2007, 11:23pm UTC](https://www.ruby-forum.com/t/tk-statusbar-help/116466/3 "2007-10-05T23:23:34Z")

</div>

Jayson W. wrote:

> Is anyone familiar at all with Ruby Tk’s StatusBar. I have not been  
> able to find out how to implement a StatusBar in my Ruby code. Could  
> someone lend me a hand?

If you’re on windows look for something in your ruby dir like

doc\ruby\ruby-1.8.6\sample\tk\tkextlib\bwidget\demo.rb

I believe bwidgets is pure tcl/tk, so there isn’t any additional C  
library to build/install.

Anyway, the demo seems to work for me, and it has a nice little status  
bar.

HTH.

---

<div class="post-metadata">

**Author:** ![jayson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/aeb1de/32.png) [@jayson](https://www.ruby-forum.com/u/jayson)\
**Post date:** [October 6, 2007, 7:11am UTC](https://www.ruby-forum.com/t/tk-statusbar-help/116466/4 "2007-10-06T07:11:53Z")

</div>

From: “Jayson W.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Tk StatusBar help  
Date: Sat, 6 Oct 2007 03:30:11 +0900  
Message-ID: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> Is anyone familiar at all with Ruby Tk’s StatusBar. I have not been  
> able to find out how to implement a StatusBar in my Ruby code. Could  
> someone lend me a hand?

## If you can use some Tk extension libraries (e.g. BWidget), it will be a simple and easy way to use a progressbar widget on such libraries. But, if you have to create a GUI with pure Tcl/Tk (without extensions), the following source may be useful.

require ‘tk’

class MyProgressBar \< TkWindow  
include TkComposite

def initialize\_composite(keys = {})  
# defaults  
bar\_color = ‘gray60’  
trough\_color = ‘gray90’  
text\_color = ‘black’  
reverse\_color = ‘white’

```
font_size = -12

@width = 150
@height = 20

# create widgets
@font = TkFont.new(['Helvetica', font_size])

@var = TkVariable.new('')

@frame.configure(:borderwidth=>3, :relief=>:ridge)

@size_base = TkFrame.new(@frame, :width=>@width, :height=>@height,
                         :borderwidth=>0).pack(:expand=>false,
                                               :fill=>:none)

@size_base.pack_propagate(false)

@base_label = TkLabel.new(@size_base, :textvariable=>@var, 

```

:font=\>@font,  
:highlightthickness=\>0, :borderwidth=\>0,  
:foreground=\>text\_color,  
:background=\>trough\_color,  
:padx=\>1, :pady=\>1).pack(:fill=\>:both,  
:expand=\>true)  
@prog\_bar = TkFrame.new(@base\_label,  
:highlightthickness=\>0, :borderwidth=\>0  
).place(:x=\>0, :y=\>0,  
:anchor=\>:nw,  
:relwidth=\>0.0, :relheight=\>1.0)

```
@prog_label = TkLabel.new(@prog_bar, :textvariable=>@var, 

```

:font=\>@font,  
:foreground=\>reverse\_color,  
:background=\>bar\_color,  
:highlightthickness=\>0, :borderwidth=\>0,  
:padx=\>1, :pady=\>1).place(:x=\>0, :y=\>0,  
:width=\>@width,  
:height=\>@height,  
:anchor=\>:nw)

```
# for bindings
@size_base.bindtags <<= @frame
@base_label.bindtags <<= @frame
@prog_bar.bindtags <<= @frame
@prog_label.bindtags <<= @frame

# delegates
delegate('DEFAULT', @frame)
delegate('background', @prog_label)
delegate('foreground', @base_label)

delegate_alias('barcolor', 'background', @prog_label)
delegate_alias('troughcolor', 'background', @base_label)
delegate_alias('textcolor', 'foreground', @base_label)
delegate_alias('reversecolor', 'foreground', @prog_label)

delegate_alias('fontfamily', 'family', @font)
delegate_alias('fontsize', 'size', @font)
delegate_alias('fontweight', 'weight', @font)
delegate_alias('fontslant', 'slant', @font)

option_methods(:width, :height, :font)

configure(keys) unless keys.empty?

```

end

def set(rate, text=nil)  
@prog\_bar.place(:relwidth=\>rate.to\_f)  
@var.value = text if text  
end

def get  
[TkPlace.current\_configinfo(@prog\_bar, :relwidth)[‘relwidth’],  
@var.value]  
end

def width(size=nil)  
if size  
@size\_base.width = size  
@prog\_label.place(:width=\>size)  
@width = size  
else  
@width  
end  
end

def height(size=nil)  
if size  
@size\_base.height = size  
@prog\_label.place(:height=\>size)  
@height = size  
else  
@height  
end  
end

def font(fnt=nil)  
if fnt  
if fnt.kind\_of?(Hash)  
@font.configure(fnt)  
else  
fnt = TkComm.simplelist(fnt) if fnt.kind\_of?(String)  
conf = {}  
conf[‘family’] = fnt.shift if fnt[0]  
conf[‘size’] = fnt.shift if fnt[0]  
fnt.each{|param|  
case param.to\_s  
when ‘normal’, ‘bold’  
conf[‘weight’] = param  
when ‘roman’, ‘italic’  
conf[‘slant’] = param  
when ‘underline’  
conf[‘underine’] = true  
when ‘overstrike’  
conf[‘overstrike’] = true  
end  
}

```
    @font.configure(conf)
  end
else
  @font
end

```

end  
end

if **FILE** == $0  
bar1 = MyProgressBar.new.pack  
bar2 = MyProgressBar.new(:width=\>120, :height=\>30,  
:barcolor=\>‘blue’, :troughcolor=\>‘white’,  
:fontsize=\>14, :fontweight=\>:bold).pack  
bar3 = MyProgressBar.new(:font=\>‘courier 8 bold’,  
:textcolor=\>‘red’, :reversecolor=\>‘yellow’,  
:width=\>250, :height=\>12).pack

bar1.set(0.0, ‘0%’)  
bar2.set(0.0, ‘0%’)  
bar3.set(0.0, ‘0%’)

bar1.bind(‘1’){p bar1.get}

timer = TkTimer.new(50, 100){|timerobj|  
cnt = timerobj.return\_value + 1  
bar1.set(cnt/100.0, “#{cnt}%”)  
bar2.set(cnt/100.0, “#{cnt}%”)  
bar3.set(cnt/100.0, “#{cnt}%”)  
cnt  
}

b = TkButton.new(:text=\>‘restart’, :command=\>proc{  
bar1.set(0.0, ‘0%’)  
bar2.set(0.0, ‘0%’)  
bar3.set(0.0, ‘0%’)  
timer.restart{0}  
}).pack  
b.invoke

Tk.mainloop  
end
