#!/usr/bin/env ruby # # timer -- # This script generates a counter with start,stop and reset buttons. # # Copyright (C) 1998 Takaaki Tateishi (ttate@jaist.ac.jp) # last update: Sat Jun 27 12:24:14 JST 1998 # require "tk" require "thread" require "tkafter" $time = "0.00" $m = Mutex.new $loop = false def timer_stop $loop = false $m.lock end def timer_start $loop = true $m.unlock end def timer_reset $time = "0.00" $root.countframe.counter['text'] = $time end def timer_loop if $loop $time = $time.succ $root.countframe.counter['text'] = $time end Tk.after(10,proc{timer_loop}) end # # thread version # def timer_loop2 while true $m.lock $time = $time.succ $root.countframe.counter['text'] = $time sleep(0.01) $m.unlock end end # # TkAfter # def timer_loop3 if $loop $time = $time.succ $root.countframe.counter['text'] = $time end end class CountFrame < TkFrame attr_reader :counter def initialize(parent=nil,keys=nil) super(parent,keys) @counter = TkLabel.new(self, 'text'=>$time, 'relief'=>'raised') @counter.pack('fill'=>'both') self end end class ButtonFrame < TkFrame def initialize(parent=nil,keys=nil) super(parent,keys) @stop = TkButton.new(self, 'text'=>'Stop', 'command'=>proc{timer_stop}) @start = TkButton.new(self, 'text'=>'Start', 'command'=>proc{timer_start}) @reset = TkButton.new(self, 'text'=>'Reset', 'command'=>proc{timer_reset}) for b in [@stop,@start,@reset] b.pack('side'=>'left', 'fill'=>'both', 'expand'=>'yes') end end end class Timer < TkRoot attr_reader :countframe def initialize super @countframe = CountFrame.new(self) @buttonframe = ButtonFrame.new(self) for f in [@buttonframe,@countframe] f.pack('side'=>'top', 'fill'=>'both') end self end end $root = Timer.new #$thread = Thread.start{timer_loop2} #timer_loop TkAfter.new(10,-1,proc{timer_loop3}).start Tk.mainloop