mirror of
https://github.com/Cantera/cantera.git
synced 2025-02-25 18:55:29 -06:00
185 lines
6.4 KiB
Python
185 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()
|
|
|
|
|