cantera/interfaces/python/MixMaster/ElementFrame.py
Ray Speth 2528df0f75 Reorganized source tree structure
These changes make it unnecessary to copy header files around during
the build process, which tends to confuse IDEs and debuggers. The
headers which comprise Cantera's external C++ interface are now in
the 'include' directory.

All of the samples and demos are now in the 'samples' subdirectory.
2012-02-12 02:27:14 +00:00

184 lines
6.4 KiB
Python

#
# function getElements displays a periodic table, and returns a list of
# the selected elements
#
from Tkinter import *
from types import *
import tkMessageBox
import string
from Cantera import *
# (row,column) positions in the periodic table
_pos = {'H':(1,1), 'He':(1,18),
'Li':(2,1), 'Be':(2,2),
'B':(2,13), 'C':(2,14), 'N':(2,15), 'O':(2,16), 'F':(2,17), 'Ne':(2,18),
'Na':(3,1), 'Mg':(3,2),
'Al':(3,13), 'Si':(3,14), 'P':(3,15), 'S':(3,16), 'Cl':(3,17), 'Ar':(3,18),
'K':(4,1), 'Ca':(4,2),
'Sc':(4,3), 'Ti':(4,4), 'V':(4,5), 'Cr':(4,6), 'Mn':(4,7), 'Fe':(4,8),
'Co':(4,9), 'Ni':(4,10), 'Cu':(4,11), 'Zn':(4,12),
'Ga':(4,13), 'Ge':(4,14), 'As':(4,15), 'Se':(4,16), 'Br':(4,17), 'Kr':(4,18),
'Rb':(5,1), 'Sr':(5,2),
'Y':(5,3), 'Zr':(5,4), 'Nb':(5,5), 'Mo':(5,6), 'Tc':(5,7), 'Ru':(5,8),
'Rh':(5,9), 'Pd':(5,10), 'Ag':(5,11), 'Cd':(5,12),
'In':(5,13), 'Sn':(5,14), 'Sb':(5,15), 'Te':(5,16), 'I':(5,17), 'Xe':(5,18)
}
class PeriodicTable(Frame):
def __init__(self, master, selected=[]):
Frame.__init__(self,master)
self.master = master
self.control = Frame(self)
self.control.config(relief=GROOVE,bd=4)
Button(self.control, text = 'Display',command=self.show).pack(fill=X,pady=3, padx=10)
Button(self.control, text = 'Clear',command=self.clear).pack(fill=X,pady=3, padx=10)
Button(self.control, text = ' OK ',command=self.get).pack(side=BOTTOM,
fill=X,pady=3, padx=10)
Button(self.control, text = 'Cancel',command=self.master.quit).pack(side=BOTTOM,
fill=X,pady=3, padx=10)
self.entries = Frame(self)
self.entries.pack(side=LEFT)
self.control.pack(side=RIGHT,fill=Y)
self.c = {}
self.element = {}
self.selected = selected
n=0
ncol = 8
for el in _pos.keys():
self.element[el] = Frame(self.entries)
self.element[el].config(relief=GROOVE, bd=4, bg=self.color(el))
self.c[el] = Button(self.element[el],text=el,bg=self.color(el),width=3,relief=FLAT)
self.c[el].pack()
self.c[el].bind("<Button-1>",self.setColors)
self.element[el].grid(row=_pos[el][0]-1, column = _pos[el][1]-1,sticky=W+N+E+S)
n = n + 1
Label(self.entries,text='select the elements to be included, and then press OK.\nTo view the properties of the selected elements, press Display ').grid(row=0, column=2, columnspan=10, sticky=W)
def select(self, el):
e = string.capitalize(el)
self.c[e]['relief'] = RAISED
self.c[e]['bg'] = self.color(e, sel=1)
def deselect(self, el):
e = string.capitalize(el)
self.c[e]['relief'] = FLAT
self.c[e]['bg'] = self.color(e, sel=0)
def selectElements(self,ellist):
for el in ellist:
ename = el
self.select(ename)
def setColors(self,event):
el = event.widget['text']
if event.widget['relief'] == RAISED:
event.widget['relief'] = FLAT
back = self.color(el, sel=0)
elif event.widget['relief'] == FLAT:
event.widget['relief'] = RAISED
back = self.color(el, sel=1)
event.widget['bg'] = back
def color(self, el, sel=0):
_normal = ['#88dddd','#dddd88','#dd8888']
_selected = ['#aaffff','#ffffaa','#ffaaaa']
row, column = _pos[el]
if sel: list = _selected
else: list = _normal
if column < 3:
return list[0]
elif column > 12:
return list[1]
else:
return list[2]
def show(self):
elnames = _pos.keys()
elnames.sort()
selected = []
for el in elnames:
if self.c[el]['relief'] == RAISED:
selected.append(periodicTable[el])
showElementProperties(selected)
def get(self):
self.selected = []
names = _pos.keys()
names.sort()
for el in names:
if self.c[el]['relief'] == RAISED:
self.selected.append(periodicTable[el])
#self.master.quit()'
self.master.destroy()
def clear(self):
for el in _pos.keys():
self.c[el]['bg'] = self.color(el, sel=0)
self.c[el]['relief'] = FLAT
class ElementPropertyFrame(Frame):
def __init__(self,master,ellist):
Frame.__init__(self,master)
n = 1
ellist.sort()
Label(self,text='Name').grid(column=0,row=0,sticky=W+S,padx=10,pady=10)
Label(self,text='Atomic \nNumber').grid(column=1,row=0,sticky=W+S,padx=10,pady=10)
Label(self,
text='Atomic \nWeight').grid(column=2,
row=0,
sticky=W+S,
padx=10,
pady=10)
for el in ellist:
Label(self,
text=el.name).grid(column=0,
row=n,
sticky=W,
padx=10)
Label(self,
text=`el.atomicNumber`).grid(column=1,
row=n,
sticky=W,
padx=10)
Label(self,
text=`el.atomicWeight`).grid(column=2,
row=n,
sticky=W,
padx=10)
n = n + 1
# utility functions
def getElements(ellist=None):
master = Toplevel()
master.title('Periodic Table of the Elements')
t = PeriodicTable(master)
if ellist: t.selectElements(ellist)
t.pack()
t.focus_set()
t.grab_set()
t.wait_window()
try:
master.destroy()
except TclError:
pass
return t.selected
# display table of selected element properties in a window
def showElementProperties(ellist):
m = Tk()
m.title('Element Properties')
elem = []
ElementPropertyFrame(m, ellist).pack()
if __name__ == "__main__":
print getElements()