« ラーメンタイマーを作る1 | トップページ | 時計をつくる1 »

2009年4月29日 (水)

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

とりあえず出来たタイマーだと3分の固定値しか計れません。最近のは1分とか5分とかバラバラだったりするので時間を変更できるように作り替えます。
ついでに、もっと見た目をわかりやすくするためにプログレスバーをつけて、時間が来たら音が鳴るようにしてみます。

では、画面を作ります。
時間の指定はWx:SpinCtrlですることにします。レンジはデフォルトの0から10。初期値を3にしました。これでセットした値はget_valueで取得できます。
プログレスバーはWx:Gaugeで時間が経過するごとにset_valueで表示を更新します。
音はズバリWx:Soundというモノがありましたのでそれを使います。
XRCファイルは以下の通り。

  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="KT2">
  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>wxALIGN_CENTER_HORIZONTAL|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>0</option>
  24.               <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL</flag>
  25.               <border>5</border>
  26.               <object class="wxBoxSizer">
  27.                 <orient>wxVERTICAL</orient>
  28.                 <object class="sizeritem">
  29.                   <option>0</option>
  30.                   <flag>wxALIGN_CENTER|wxALL</flag>
  31.                   <border>5</border>
  32.                   <object class="wxStaticText" name="m_staticText2">
  33.                     <font>
  34.                       <size>55</size>
  35.                       <family>default</family>
  36.                       <style>normal</style>
  37.                       <weight>normal</weight>
  38.                       <underlined>0</underlined>
  39.                     </font>
  40.                     <label>00:00</label>
  41.                   </object>
  42.                 </object>
  43.                 <object class="sizeritem">
  44.                   <option>0</option>
  45.                   <flag>wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND</flag>
  46.                   <border>5</border>
  47.                   <object class="wxGauge" name="m_gauge1">
  48.                     <style>wxGA_HORIZONTAL|wxGA_SMOOTH</style>
  49.                     <range>100</range>
  50.                     <value>0</value>
  51.                   </object>
  52.                 </object>
  53.               </object>
  54.             </object>
  55.           </object>
  56.         </object>
  57.         <object class="sizeritem">
  58.           <option>0</option>
  59.           <flag>wxALIGN_CENTER_HORIZONTAL</flag>
  60.           <border>5</border>
  61.           <object class="wxBoxSizer">
  62.             <orient>wxHORIZONTAL</orient>
  63.             <object class="sizeritem">
  64.               <option>0</option>
  65.               <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag>
  66.               <border>5</border>
  67.               <object class="wxStaticText" name="m_staticText21">
  68.                 <label>Set Alarm</label>
  69.               </object>
  70.             </object>
  71.             <object class="sizeritem">
  72.               <option>0</option>
  73.               <flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
  74.               <border>5</border>
  75.               <object class="wxSpinCtrl" name="m_spinCtrl1">
  76.                 <style>wxSP_ARROW_KEYS</style>
  77.                 <value>3</value>
  78.                 <min>0</min>
  79.                 <max>10</max>
  80.               </object>
  81.             </object>
  82.           </object>
  83.         </object>
  84.         <object class="sizeritem">
  85.           <option>0</option>
  86.           <flag>wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL</flag>
  87.           <border>5</border>
  88.           <object class="wxButton" name="m_button1">
  89.             <label>START!</label>
  90.             <default>0</default>
  91.           </object>
  92.         </object>
  93.       </object>
  94.     </object>
  95.   </object>
  96. </resource>
  97.  

コンバートして、

  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: KT2.xrc
  7. # Generated at: Wed Apr 29 02:40:24 &#26481;&#20140; (&#27161;&#28310;&#26178;) 2009
  8.  
  9. class KT2 < Wx::Frame
  10.  
  11.   attr_reader :m_panel1, :m_statictext2, :m_gauge1, :m_statictext21,
  12.               :m_spinctrl1, :m_button1
  13.  
  14.   def initialize(parent = nil)
  15.     super()
  16.     xml = Wx::XmlResource.get
  17.     xml.flags = 2 # Wx::XRC_NO_SUBCLASSING
  18.     xml.init_all_handlers
  19.     xml.load("KT2.xrc")
  20.     xml.load_frame_subclass(self, parent, "MyFrame1")
  21.  
  22.     finder = lambda do | x |
  23.       int_id = Wx::xrcid(x)
  24.       begin
  25.         Wx::Window.find_window_by_id(int_id, self) || int_id
  26.       # Temporary hack to work around regression in 1.9.2; remove
  27.       # begin/rescue clause in later versions
  28.       rescue RuntimeError
  29.         int_id
  30.       end
  31.     end
  32.  
  33.     @m_panel1 = finder.call("m_panel1")
  34.     @m_statictext2 = finder.call("m_staticText2")
  35.     @m_gauge1 = finder.call("m_gauge1")
  36.     @m_statictext21 = finder.call("m_staticText21")
  37.     @m_spinctrl1 = finder.call("m_spinCtrl1")
  38.     @m_button1 = finder.call("m_button1")
  39.     if self.class.method_defined? "on_init"
  40.       self.on_init()
  41.     end
  42.   end
  43. end
  44.  
  45.  

処理を付け加えます。

  1. require 'rubygems'
  2. require 'wx'
  3. require 'KT2.rb'
  4.  
  5. class RamenTimer2 < KT2
  6.   def initialize(parent = nil)
  7.     super()
  8.  
  9.     # Notification Sound
  10.     @sound = Wx::Sound.new('C:/WINNT/Media/notify.wav')
  11.  
  12.     # Button Event Handler
  13.     evt_button(m_button1.get_id()) {|event| on_buttonClick(event)}
  14.  
  15.     # Timer Event Handler
  16.     @m_timer = Wx::Timer.new(self)
  17.     evt_timer(@m_timer.get_id()) { |event| on_Timer(event)}
  18.   end
  19.  
  20.   # Button Event
  21.   def on_buttonClick(event)
  22.     # Set alarm time
  23.     time = @m_spinctrl1.get_value
  24.     @time = time * 60
  25.  
  26.     # Gauge setting
  27.     @m_gauge1.set_range(@time)
  28.     @m_gauge1.set_value(@time)
  29.  
  30.     @m_timer.start(1000)
  31.   end
  32.  
  33.   # Timer Event
  34.   def on_Timer(event)
  35.     # Update Time
  36.     time_str = "%02d" % (@time / 60).to_s + ":" + "%02d" % (@time % 60).to_s
  37.     m_statictext2.set_label(time_str)
  38.  
  39.     # Update Gauge
  40.     @m_gauge1.set_value(@time)
  41.  
  42.     if(@time > 0)
  43.       @time = @time - 1
  44.     else
  45.       @m_timer.stop
  46.       @sound.play
  47.     end
  48.   end
  49.  
  50. end
  51.  
  52.  
  53. class App < Wx::App
  54.   def on_init
  55.     f =  ::RamenTimer2.new
  56.     f.show
  57.   end
  58. end
  59. App.new.main_loop
  60.  

できあがった画面です。

01

|

« ラーメンタイマーを作る1 | トップページ | 時計をつくる1 »

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

コメント

コメントを書く



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




トラックバック

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

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

« ラーメンタイマーを作る1 | トップページ | 時計をつくる1 »