Hidetoshi NAGAI wrote:
From: David B. [email protected]
Subject: Callback For A Timer Event To Display Widget in Ruby/Tk
Date: Mon, 27 Mar 2006 23:14:23 +0900
Message-ID: [email protected]
But, I have searched high and low, and I can not find out how to set up
a callback for a timer event. I just want to display a time string on
the TkCanvas or TkTopLevel window once per second. I have gone through
a Perl/Tk reference book and I’m still having trouble figuring out how
to “translate” this into Ruby/Tk.
For such case which is sensitive about interval time,
I recommend TkRTTimer class ( available Ruby 1.8.3 or later).
That is unique to Ruby/Tk.
Please see “/ext/tk/sample/tkrttimer.rb”.
It shows the difference between TkTimer class and TkRTTimer class.
Hidetoshi,
I have coded the ‘elapsed time’ display that I needed. I used TkTimer
versus TkRTTimer because I am at 1.8.2 currently, and I do not require
accurate real-time event handling at this time. If and when I do, I
will use the TkRTTimer class.
I have two quick questions: will my creation of all those Time.new
objects (two per second) cause me to run out of resources if I do it for
a long time?
Secondly, while this ‘elapsed time’ code works:
“Elapsed is #{(Time.at(Time.new.to_i - (oldTime.to_i -
18000))).strftime(”%X")}"
I have a sneaky feeling that it is not the best (Ruby?) way. Is it way
too resource wasteful, and if so, is there a more “Ruby” way?
In any case, I thank you for your help,
David
P.S. It took me a while to translate “/ext/tk/sample/tkrttimer.rb” into the URL where the code actually
was. But I figured you meant that to be a test of my ‘worthiness’!
(:>)
P.P.S. The test that I constructed, straight from your example, follows:
continuously display ‘current’ and ‘elapsed’ time once per second
…
require ‘tk’
root = TkRoot.new(:title=>‘Timer Event Example’)
label2 = TkLabel.new(:parent=>root, :width=>10)
.pack(:side=>:bottom, :fill=>:both)
label = TkLabel.new(:parent=>root, :width=>10)
.pack(:side=>:bottom, :fill=>:both)
oldTime = Time.new
define the ‘current time’ procedure repeated by the TkTimer object
timeProc = proc{|tObj| #<== TkTimer object
tRtnVal = tObj.return_value + 1000 # return_value keeps a result of
the last proc
label.text format(“Time is #{Time.new.strftime(”%X")}",
*(cnt.divmod(100)))
tRtnVal
}
define the ‘elapsed time’ procedure repeated by the TkTimer object
elapsedProc = proc{|tObj2| #<== TkTimer object
tRtnVal2 = tObj2.return_value + 1000 # return_value keeps a result of
the last proc
label2.text format(“Elapsed is #{(Time.at(Time.new.to_i -
(oldTime.to_i - 18000))).strftime(”%X")}", *(cnt.divmod(100)))
tRtnVal2
}
timer = TkTimer.new(1000, -1, timeProc).start(0, proc{ label.text(‘The
time is …’); 0 })
timer2 = TkTimer.new(1000, -1, elapsedProc).start(0, proc{
label2.text(‘Elapsed time is …’); 0 })
ev_quit = TkVirtualEvent.new(‘Control-c’, ‘Control-q’, ‘q’)
Tk.root.bind(ev_quit, proc{Tk.exit}).focus
Tk.mainloop