如何运行秒表程序?

我从网站上借了一些代码,但我不知道如何让它显示出来。

class Stopwatch def start @accumulated = 0 unless @accumulated @elapsed = 0 @start = Time.now @mybutton.configure('text' => 'Stop') @mybutton.command { stop } @timer.start end def stop @mybutton.configure('text' => 'Start') @mybutton.command { start } @timer.stop @accumulated += @elapsed end def reset stop @accumulated, @elapsed = 0, 0 @mylabel.configure('text' => '00:00:00.00.000') end def tick @elapsed = Time.now - @start time = @accumulated + @elapsed h = sprintf('%02i', (time.to_i / 3600)) m = sprintf('%02i', ((time.to_i % 3600) / 60)) s = sprintf('%02i', (time.to_i % 60)) mt = sprintf('%02i', ((time - time.to_i)*100).to_i) ms = sprintf('%04i', ((time - time.to_i)*10000).to_i) ms[0..0]='' newtime = "#{h}:#{m}:#{s}.#{mt}.#{ms}" @mylabel.configure('text' => newtime) end end 

我该如何开始运行? 谢谢

根据rkneufeld发布的附加代码,此类需要一个特定于Tk的计时器。 要在控制台上执行此操作,您可以创建一个一遍又一遍地调用tick的循环。 当然,您必须删除与GUI相关的所有代码:

 class Stopwatch def start @accumulated = 0 unless @accumulated @elapsed = 0 @start = Time.now # @mybutton.configure('text' => 'Stop') # @mybutton.command { stop } # @timer.start end def stop # @mybutton.configure('text' => 'Start') # @mybutton.command { start } # @timer.stop @accumulated += @elapsed end def reset stop @accumulated, @elapsed = 0, 0 # @mylabel.configure('text' => '00:00:00.00.000') end def tick @elapsed = Time.now - @start time = @accumulated + @elapsed h = sprintf('%02i', (time.to_i / 3600)) m = sprintf('%02i', ((time.to_i % 3600) / 60)) s = sprintf('%02i', (time.to_i % 60)) mt = sprintf('%02i', ((time - time.to_i)*100).to_i) ms = sprintf('%04i', ((time - time.to_i)*10000).to_i) ms[0..0]='' newtime = "#{h}:#{m}:#{s}.#{mt}.#{ms}" # @mylabel.configure('text' => newtime) end end watch = Stopwatch.new watch.start 1000000.times do puts watch.tick end 

你最终得到这样的输出:

 00:00:00.00.000 00:00:00.00.000 00:00:00.00.000 ... 00:00:00.00.000 00:00:00.00.000 00:00:00.01.160 00:00:00.01.160 ... 

不是特别有用,但确实如此。 现在,如果你想在Shoes中做类似的事情,试试这个非常相似的教程 。

我相信你在这个网站上找到了这个例子

我正在重复网站上已有的内容,但您遗漏了:

 require 'tk' 

以及初始化代码:

  def initialize root = TkRoot.new { title 'Tk Stopwatch' } menu_spec = [ [ ['Program'], ['Start', lambda { start } ], ['Stop', lambda { stop } ], ['Exit', lambda { exit } ] ], [ ['Reset'], ['Reset Stopwatch', lambda { reset } ] ] ] @menubar = TkMenubar.new(root, menu_spec, 'tearoff' => false) @menubar.pack('fill'=>'x', 'side'=>'top') @myfont = TkFont.new('size' => 16, 'weight' => 'bold') @mylabel = TkLabel.new(root) @mylabel.configure('text' => '00:00:00.0', 'font' => @myfont) @mylabel.pack('padx' => 10, 'pady' => 10) @mybutton = TkButton.new(root) @mybutton.configure('text' => 'Start') @mybutton.command { start } @mybutton.pack('side'=>'left', 'fill' => 'both') @timer = TkAfter.new(1, -1, proc { tick }) Tk.mainloop end end Stopwatch.new 

我建议您阅读网站的其他部分,了解发生了什么。

我正在寻找一个快速而肮脏的秒表类,以避免编码,并来到原始代码发布的网站和本网站。

最后,我修改了代码,直到它符合我认为我最初搜索的内容。

如果有人感兴趣,到目前为止我最终的版本如下(尽管我还没有将它应用于我当前正在更新的应用程序中,并且我想要使用这些function)。

 # REFERENCES # 1. http://stackoverflow.com/questions/858970/how-to-get-a-stopwatch-program-running # 2. http://codeidol.com/other/rubyckbk/User-Interface/Creating-a-GUI-Application-with-Tk/ # 3. http://books.google.com.au/books?id=bJkznhZBG6gC&pg=PA806&lpg=PA806&dq=ruby+stopwatch+class&source=bl&ots=AlH2e7oWWJ&sig=KLFR-qvNfBfD8WMrUEbVqMbN_4o&hl=en&ei=WRjOTbbNNo2-uwOkiZGwCg&sa=X&oi=book_result&ct=result&resnum=8&ved=0CEsQ6AEwBw#v=onepage&q=ruby%20stopwatch%20class&f=false # 4. http://4loc.wordpress.com/2008/09/24/formatting-dates-and-floats-in-ruby/ module Utilities class StopWatch def new() @watch_start_time = nil #Time (in seconds) when the stop watch was started (ie the start() method was called). @lap_start_time = nil #Time (in seconds) when the current lap started. end #def new def start() myCurrentTime = Time.now() #Current time in (fractional) seconds since the Epoch (January 1, 1970 00:00 UTC) if (!running?) then @watch_start_time = myCurrentTime @lap_start_time = @watch_start_time end #if myCurrentTime - @watch_start_time; end #def start def lap_time_seconds() myCurrentTime = Time.now() myLapTimeSeconds = myCurrentTime - @lap_start_time @lap_start_time = myCurrentTime myLapTimeSeconds end #def lap_time_seconds def stop() myTotalSecondsElapsed = Time.now() - @watch_start_time @watch_start_time = nil myTotalSecondsElapsed end #def stop def running?() !@watch_start_time.nil? end #def end #class StopWatch end #module Utilities def kill_time(aRepeatCount) aRepeatCount.times do #just killing time end #do end #def kill_time elapsed_time_format_string = '%.3f' myStopWatch = Utilities::StopWatch.new() puts 'total time elapsed: ' + elapsed_time_format_string % myStopWatch.start() + ' seconds' kill_time(10000000) puts 'lap time: ' + elapsed_time_format_string % myStopWatch.lap_time_seconds() + ' seconds' kill_time(20000000) puts 'lap time: ' + elapsed_time_format_string % myStopWatch.lap_time_seconds() + ' seconds' kill_time(30000000) puts 'lap time: ' + elapsed_time_format_string % myStopWatch.lap_time_seconds() + ' seconds' puts 'total time elapsed: ' + elapsed_time_format_string % myStopWatch.stop() + ' seconds' 

简单的秒表脚本:

 # pass the number of seconds as the parameter seconds = eval(ARGV[0]).to_i start_time = Time.now loop do elapsed = Time.now - start_time print "\e[D" * 17 print "\033[K" if elapsed > seconds puts "Time's up!" exit end print Time.at(seconds - elapsed).utc.strftime('%H:%M:%S.%3N') sleep(0.05) end 

在您的终端中以这样的方式运行(标记一圈,只需点击输入):

 # 10 is the number of seconds ruby script.rb 10 # you can even do this: ruby script.rb "20*60" # 20 minutes