British単位系からSI系への換算ツール(3)

一応すべて実装した。このソフトでできることは次の通り(のはず)。

  • British単位系での数値を入力する
  • (物理)量を選択する(選択できる量は図1の通り)
  • 「換算」ボタンを押す
  • 換算された値がSI単位系で表示される


図1:物理量の選択


適当に選んで実行してみる。

図2:長さの場合(これは単なる掛け算)

図3:温度の場合(これは掛け算と足し算)

図4:圧力の場合(え?ちょっと違う?)

以下、ソース。

#!/bin/env python
# coding: utf-8
# BritishUnit.py                                  (2009/07/11 23:58:30)
#------------------------------------------------------------------------
import wx
import os, sys
import time

ChoiceList = ["Length [ft]", "Area [ft^2]", "Velocity [ft/s]",
              "Mass [lbm]", "Energy [Btu]", "Temperature [F]",
              "Density [lbm/ft^3]", "Mass flux [lbm/s]", "Enthalpy [Btu/lbm]",
              "Pressure [psia]", "Pressure [lbf/ft^2]", "Heat [Btu/s]"]

SIList = ["[m]", "[m^2]", "[m/s]",
          "[kg]", "[kJ]", "[C]",
          "[kg/m^3]", "[kg/s]", "[kJ/kg]",
          "[Pa]", "[Pa]", "[W]"]

coeff = [0.3048, 0.3048**2, 0.3048,
         0.45359237, 1.055, 5.0/9.0,
         0.45359237/(0.3048)**3, 0.45359237, 1.055/0.45359237,
         703.07*9806.65, 4.44822/(0.3048)**2, 1055.0]

bb = [0.0, 0.0, 0.0,
      0.0, 0.0, 32.0,
      0.0, 0.0, 0.0,
      0.0, 0.0, 0.0]

class MainFrame(wx.Frame):       
    def __init__(self, id, title):
        width, height = 450,120
        wx.Frame.__init__(self, id, title=u"Changing Unit",
                          size=wx.Size(width, height))
        Pan = wx.Panel(self, -1)
        self.Chce = wx.Choice(Pan, -1, choices=ChoiceList)
        self.TxtCtl = wx.TextCtrl(Pan, -1, "Enter a value", size=(130,-1))
        self.StTxt1 = wx.StaticText(Pan, -1, u" = ")
        self.Btn = wx.Button(Pan, -1, u"換算する")
        
        self.Chce.Bind(wx.EVT_CHOICE, self.OnChoice)
        self.Btn.Bind(wx.EVT_BUTTON, self.ConvUnit)

        vsizer0 = wx.BoxSizer(wx.VERTICAL)             
        hsizer1 = wx.BoxSizer(wx.HORIZONTAL)        
        hsizer1.Add(self.TxtCtl, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        hsizer1.Add(self.Chce, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        hsizer1.Add(self.StTxt1, 0, wx.ALIGN_LEFT|wx.ALL, 5)        
        vsizer0.Add(hsizer1,0, wx.ALIGN_LEFT|wx.ALL, 5)
        vsizer0.Add(self.Btn,0, wx.ALIGN_LEFT|wx.ALL, 5)
        Pan.SetSizer(vsizer0)
        vsizer0.Fit(Pan)

    def OnChoice(self, event):
        pass
        
    def ConvUnit(self, event):
        BtVal= float(self.TxtCtl.GetValue())
        CNum = self.Chce.GetSelection()
        SiVal= (BtVal-bb[CNum])*coeff[CNum]
        newString = "= " + str(SiVal) + SIList[CNum]
        self.StTxt1.SetLabel(newString)

class Application(wx.App):
    def OnInit(self):
        frame = MainFrame(None, -1)
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

def main():
    app = Application(0)
    app.MainLoop()

if __name__ == '__main__':
    main()