2009-05-13 3 views
1

Я заимствовал код с сайта, но не знаю, как его отобразить.Как запустить программу секундомера?

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 

Как бы мне это сделать? Благодаря

+0

Какие рамки вы планировали использовать этот ? – Pesto

+0

Обувь. Если вы не порекомендуете лучшего. Я своего рода новичок. – danhere

ответ

4

На основании дополнительного кода rkneufeld, данный класс требует таймера, специфичного для Tk. Чтобы сделать это на консоли, вы можете просто создать цикл, который вызывает галочку снова и снова. Конечно, вы должны удалить весь код, который был связан с графическим интерфейсом:

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

Не особенно полезно, но там. Теперь, если вы хотите сделать что-то подобное в обуви, попробуйте this tutorial, что очень похоже.

2

Я считаю, что вы нашли пример на this site

Я повторяю то, что уже есть на сайте, но вам не хватает:

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 

Я бы предложил прочитать остальную часть the site, чтобы понять, что все происходит.

+0

Да, я знаю это. Я хочу использовать Обувь вместо этого и пытаюсь преобразовать его как таковой. Я бы хотел, чтобы он просто хотел что-то вернуть, даже в терминале. – danhere

1

Я искал быстрый и грязный класс секундомера, чтобы избежать кодирования такого и натолкнулся на сайт, на котором был опубликован оригинальный код, и этот сайт также.

В конце концов, я изменил код, пока не встретил то, что, как я думаю, изначально искал.

В случае, если кому-то интересно, версия, с которой я закончил, выглядит следующим образом (хотя я еще не применил ее в приложении, которое я сейчас обновляю, и для которого я хочу использовать такие функциональность).

# 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 (i.e. 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?() 
     [email protected]_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' 
0

Простой секундомер сценарий:

# 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 

Run, как это в вашем терминале (чтобы отметить круг, просто нажмите ввод):

# 10 is the number of seconds 
ruby script.rb 10 
# you can even do this: 
ruby script.rb "20*60" # 20 minutes 
Смежные вопросы