« Hello Worldをつくる3 | トップページ | ラーメンタイマーを作る2 »

2009年4月26日 (日)

ラーメンタイマーを作る1

Hello Worldで概ね作り方が分かったので、なんか作ってみます。

いいアイデアが浮かばなかったので、3分カウントダウンをしてくれるカップラーメン用のタイマーを作ってみます。
画面は今まで作ったモノをいじって、時間を表示するWx:StaticTextとカウントを開始するきっかけとなるWx:Buttonがあればよいでしょう。

さて、時間をカウントするにはどうすればよいか。いつものwxRubyのリファレンスを見ていくとmiscellaneousのところにWx::Timerというズバリなものがあるじゃあないですか。コレは使えそうです。

説明を見てみると、

Secondly you may use the event handling mechanism to direct events to any object which inherits from EvtHandler. To do this use the longer constructor or set_owner. Then use the evt_timer method to connect it to the event handler which will receive TimerEvent notifications.

assuming ‘self’ is some Window or Wx::App timer = Wx::Timer.new(self) evt_timer(timer.id) { puts “Timer ticked” } timer.start(100)

evt_timerがイベントハンドラで、Wx:Timer.startとかstopで制御できるようです。引数でイベント生成の間隔が指定できると。あとは、通常のイベント処理と同じように書けば良さそうです。

画面を作って、コードを追加してみましょう。まずは画面から。

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
  2. <resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1">
  3.   <object class="wxFrame" name="MyFrame1" subclass="KT1">
  4.     <style>wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL</style>
  5.     <size>500,300</size>
  6.     <title></title>
  7.     <object class="wxPanel" name="m_panel1">
  8.       <style>wxTAB_TRAVERSAL</style>
  9.       <object class="wxBoxSizer">
  10.         <orient>wxVERTICAL</orient>
  11.         <object class="sizeritem">
  12.           <option>1</option>
  13.           <flag>wxEXPAND</flag>
  14.           <border>5</border>
  15.           <object class="wxFlexGridSizer">
  16.             <rows>1</rows>
  17.             <cols>1</cols>
  18.             <vgap>0</vgap>
  19.             <hgap>0</hgap>
  20.             <growablecols>0</growablecols>
  21.             <growablerows>0</growablerows>
  22.             <object class="sizeritem">
  23.               <option>1</option>
  24.               <flag>wxALIGN_CENTER|wxALL</flag>
  25.               <border>5</border>
  26.               <object class="wxStaticText" name="m_staticText2">
  27.                 <font>
  28.                   <size>55</size>
  29.                   <family>default</family>
  30.                   <style>normal</style>
  31.                   <weight>normal</weight>
  32.                   <underlined>0</underlined>
  33.                 </font>
  34.                 <label>00:00</label>
  35.               </object>
  36.             </object>
  37.           </object>
  38.         </object>
  39.         <object class="sizeritem">
  40.           <option>0</option>
  41.           <flag>wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND</flag>
  42.           <border>5</border>
  43.           <object class="wxButton" name="m_button1">
  44.             <label>START!</label>
  45.             <default>0</default>
  46.           </object>
  47.         </object>
  48.       </object>
  49.     </object>
  50.   </object>
  51. </resource>
  52.  

いつものようにXRCファイルを変換して

  1.  
  2. # This class was automatically generated from XRC source. It is not
  3. # recommended that this file is edited directly; instead, inherit from
  4. # this class and extend its behaviour there. 
  5. #
  6. # Source file: KT1.xrc
  7. # Generated at: Sun Apr 26 01:17:05 &#26481;&#20140; (&#27161;&#28310;&#26178;) 2009
  8.  
  9. class KT1 < Wx::Frame
  10.  
  11.   attr_reader :m_panel1, :m_statictext2, :m_button1
  12.  
  13.   def initialize(parent = nil)
  14.     super()
  15.     xml = Wx::XmlResource.get
  16.     xml.flags = 2 # Wx::XRC_NO_SUBCLASSING
  17.     xml.init_all_handlers
  18.     xml.load("KT1.xrc")
  19.     xml.load_frame_subclass(self, parent, "MyFrame1")
  20.  
  21.     finder = lambda do | x |
  22.       int_id = Wx::xrcid(x)
  23.       begin
  24.         Wx::Window.find_window_by_id(int_id, self) || int_id
  25.       # Temporary hack to work around regression in 1.9.2; remove
  26.       # begin/rescue clause in later versions
  27.       rescue RuntimeError
  28.         int_id
  29.       end
  30.     end
  31.  
  32.     @m_panel1 = finder.call("m_panel1")
  33.     @m_statictext2 = finder.call("m_staticText2")
  34.     @m_button1 = finder.call("m_button1")
  35.     if self.class.method_defined? "on_init"
  36.       self.on_init()
  37.     end
  38.   end
  39. end
  40.  
  41.  

イベント処理のコードを追加。こんなかんじです。

  1. require 'rubygems'
  2. require 'wx'
  3. require 'KT1.rb'
  4.  
  5. class RamenTimer1 < KT1
  6.   def initialize(parent = nil)
  7.     super()
  8.  
  9.     # Button Event Handler
  10.     evt_button(m_button1.get_id()) {|event| on_buttonClick(event)}
  11.  
  12.     # Timer Event Handler
  13.     @time = 180
  14.     @m_timer = Wx::Timer.new(self)
  15.     evt_timer(@m_timer.get_id()) { |event| on_Timer(event)}
  16.   end
  17.  
  18.   # Button Event
  19.   def on_buttonClick(event)
  20.     @m_timer.start(1000)
  21.   end
  22.  
  23.   # Timer Event
  24.   def on_Timer(event)
  25.     time_str = "%02d" % (@time / 60).to_s + ":" + "%02d" % (@time % 60).to_s
  26.     m_statictext2.set_label(time_str)
  27.  
  28.     if(@time > 0)
  29.       @time = @time - 1
  30.     else
  31.       @m_timer.stop
  32.       @time = 180
  33.     end
  34.   end
  35.  
  36. end
  37.  
  38.  
  39. class App < Wx::App
  40.   def on_init
  41.     f =  ::RamenTimer1.new
  42.     f.show
  43.   end
  44. end
  45. App.new.main_loop
  46.  

実行してみましょう。

01

ちゃんと動いているようです。

|

« Hello Worldをつくる3 | トップページ | ラーメンタイマーを作る2 »

3分でラーメンタイマーを作る」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1201593/29297263

この記事へのトラックバック一覧です: ラーメンタイマーを作る1:

« Hello Worldをつくる3 | トップページ | ラーメンタイマーを作る2 »