class thermo:
def __init__(self,master):
# Master frame - entire window
master.title('Thermo Calculations')
self.outer_frame = Frame(master)
self.outer_frame.pack()
# Inner frame for left side
self.left_frame = Frame(self.outer_frame)
self.left_frame.pack(side=LEFT)
# Temperature input frame
self.temp_frame = LabelFrame(self.left_frame, text='Temperature (K)', bg='blue', fg='white', height=125, width=250)
self.temp_frame.pack(side=TOP)
self.temp_frame.pack_propagate(0)
self.temp_slider = Scale(self.temp_frame, from_=220, to=330, orient=HORIZONTAL, command=self.calculations)
self.temp_slider.set(275)
self.temp_slider.place(relx=.5, rely=.5, anchor='center')
# Relative humidity deisplay frame
self.rh_frame = LabelFrame(self.left_frame, text='Relative Humidity (%)', bg='blue', fg='white', height=100, width=250)
self.rh_frame.pack()
self.rh_frame.pack_propagate(0)
self.rh_slider = Scale(self.rh_frame, from_=0, to=100, orient=HORIZONTAL, command=self.calculations)
self.rh_slider.place(relx=.5, rely=.5, anchor='center')
# Dewpoint temp display frame
self.dewpt_frame = LabelFrame(self.left_frame, text='Dewpoint Temperature', height=100, width=250)
self.dewpt_frame.pack()
self.dewpt_frame.pack_propagate(0)
self.dewpt_text = StringVar()
self.dewpt_label = Label(self.dewpt_frame, textvariable=self.dewpt_text)
self.dewpt_label.place(relx=.5, rely=.5, anchor='center')
# Mixing ratio display frame
self.mix_ratio_frame = LabelFrame(self.left_frame, text='Mixing Ratio', height=100, width=250)
self.mix_ratio_frame.pack()
self.mix_ratio_frame.pack_propagate(0)
self.mix_ratio_text = StringVar()
self.mix_ratio_label = Label(self.mix_ratio_frame, textvariable=self.mix_ratio_text)
self.mix_ratio_label.place(relx=.5, rely=.5, anchor='center')
# Saturation mixing ratio display frame
self.sat_mix_ratio_frame = LabelFrame(self.left_frame, text='Saturation Mixing Ratio', height=100, width=250)
self.sat_mix_ratio_frame.pack()
self.sat_mix_ratio_frame.pack_propagate(0)
self.sat_mix_ratio_text = StringVar()
self.sat_mix_ratio_label = Label(self.sat_mix_ratio_frame, textvariable=self.sat_mix_ratio_text)
self.sat_mix_ratio_label.place(relx=.5, rely=.5, anchor='center')
# Inner frame for right side
self.right_frame = Frame(self.outer_frame)
self.right_frame.pack()
# Pressure input frame
self.press_frame = LabelFrame(self.right_frame, text='Pressure (mb)', bg='blue', fg='white', height=125, width=250)
self.press_frame.pack()
self.press_frame.pack_propagate(0)
self.press_slider = Scale(self.press_frame, from_=990, to=1030, orient=HORIZONTAL, command=self.calculations)
self.press_slider.set(1010)
self.press_slider.place(relx=.5, rely=.5, anchor='center')
# Potential temp display frame
self.pot_temp_frame = LabelFrame(self.right_frame, text='Potential Temperature', height=100, width=250)
self.pot_temp_frame.pack()
self.pot_temp_frame.pack_propagate(0)
self.pot_temp_text = StringVar()
self.pot_temp_label = Label(self.pot_temp_frame, textvariable=self.pot_temp_text)
self.pot_temp_label.place(relx=.5, rely=.5, anchor='center')
# Equiv potential temp display frame
self.equiv_pot_temp_frame = LabelFrame(self.right_frame, text='Equivalent Potential Temperature', height=100, width=250)
self.equiv_pot_temp_frame.pack()
self.equiv_pot_temp_frame.pack_propagate(0)
self.equiv_pot_temp_text = StringVar()
self.equiv_pot_temp_label = Label(self.equiv_pot_temp_frame, textvariable=self.equiv_pot_temp_text)
self.equiv_pot_temp_label.place(relx=.5, rely=.5, anchor='center')
# Vapor Pressure display frame
self.vap_press_frame = LabelFrame(self.right_frame, text='Vapor Pressure', height=100, width=250)
self.vap_press_frame.pack()
self.vap_press_frame.pack_propagate(0)
self.vap_press_text = StringVar()
self.vap_press_label = Label(self.vap_press_frame, textvariable=self.vap_press_text)
self.vap_press_label.place(relx=.5, rely=.5, anchor='center')
# Saturation vapor pressure display frame
self.sat_vap_press_frame = LabelFrame(self.right_frame, text='Saturation Vapor Pressure', height=100, width=250)
self.sat_vap_press_frame.pack()
self.sat_vap_press_frame.pack_propagate(0)
self.sat_vap_press_text = StringVar()
self.sat_vap_press_label = Label(self.sat_vap_press_frame, textvariable=self.sat_vap_press_text)
self.sat_vap_press_label.place(relx=.5, rely=.5, anchor='center')
def calculations(self, value=0):
# value is a dummy variable, needed when widgets call a command - they also send a value
result = self.thermocalcs(self.temp_slider.get(), self.press_slider.get(), self.rh_slider.get())
return result
def thermocalcs(self, temperature, pressure, rh):
# Calculate potential temperature and equivalent potential temperature
pot_temp = potential_temperature(pressure * units.mbar, temperature * units.kelvin)
self.pot_temp_text.set('{0:.2f}'.format(pot_temp))
equiv_pot_temp = equivalent_potential_temperature(pressure * units.mbar, temperature * units.kelvin)
self.equiv_pot_temp_text.set('{0:.2f}'.format(equiv_pot_temp))
# Calculate saturation vapor pressure
sat_vap_press = saturation_vapor_pressure(temperature * units.kelvin)
self.sat_vap_press_text.set('{0:.4f} {1:s}'.format(sat_vap_press.magnitude, 'mb'))
# Caclculate mixing ratio and saturation mixing ratio
mix_ratio = mixing_ratio((rh * sat_vap_press / 100), pressure * units.mbar)
self.mix_ratio_text.set('{0:.6f} {1:s}'.format(mix_ratio.to('g/kg').magnitude, 'g/kg'))
sat_mix_ratio = saturation_mixing_ratio(pressure * units.mbar, temperature * units.kelvin)
self.sat_mix_ratio_text.set('{0:.6f} {1:s}'.format(sat_mix_ratio.to('g/kg').magnitude, 'g/kg'))
# Calculate vapor pressure
vap_press = sat_vap_press * (rh / 100)
self.vap_press_text.set('{0:.4f} {1:s}'.format(vap_press.magnitude, 'mb'))
# Calculate dewpoint temperature
if rh == 0:
self.dewpt_text.set('dry')
else:
dewpt = dewpoint_rh(temperature * units.kelvin, (rh/100))
self.dewpt_text.set('{0:.2f}'.format(dewpt.to('kelvin')))