#!/usr/bin/env python # coding: utf-8 # In[1]: from tkinter import * from metpy.calc import * from metpy.units import units # In[88]: 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'))) # In[89]: root = Tk() root.geometry("500x525") app = thermo(root) root.mainloop() # In[ ]: