Source code for psi4_step.tk_thermochemistry
# -*- coding: utf-8 -*-
"""The graphical part of a Thermochemistry step"""
import logging
import tkinter as tk
import tkinter.ttk as ttk
import psi4_step
import seamm_widgets as sw
logger = logging.getLogger(__name__)
[docs]
class TkThermochemistry(psi4_step.TkEnergy):
"""
The graphical part of a Thermochemistry step in a flowchart.
Attributes
----------
tk_flowchart : TkFlowchart = None
The flowchart that we belong to.
node : Node = None
The corresponding node of the non-graphical flowchart
canvas: tkCanvas = None
The Tk Canvas to draw on
dialog : Dialog
The Pmw dialog object
x : int = None
The x-coordinate of the center of the picture of the node
y : int = None
The y-coordinate of the center of the picture of the node
w : int = 200
The width in pixels of the picture of the node
h : int = 50
The height in pixels of the picture of the node
self[widget] : dict
A dictionary of tk widgets built using the information
contained in Thermochemistry_parameters.py
See Also
--------
Thermochemistry, TkThermochemistry,
ThermochemistryParameters,
"""
def __init__(
self,
tk_flowchart=None,
node=None,
canvas=None,
x=None,
y=None,
w=200,
h=50,
my_logger=logger,
):
"""
Initialize a graphical node.
Parameters
----------
tk_flowchart: Tk_Flowchart
The graphical flowchart that we are in.
node: Node
The non-graphical node for this step.
namespace: str
The stevedore namespace for finding sub-nodes.
canvas: Canvas
The Tk canvas to draw on.
x: float
The x position of the nodes center on the canvas.
y: float
The y position of the nodes cetner on the canvas.
w: float
The nodes graphical width, in pixels.
h: float
The nodes graphical height, in pixels.
Returns
-------
None
"""
self.dialog = None
self.first_calculation = False
super().__init__(
tk_flowchart=tk_flowchart,
node=node,
canvas=canvas,
x=x,
y=y,
w=w,
h=h,
my_logger=my_logger,
)
[docs]
def create_dialog(self):
"""
Create the dialog. A set of widgets will be chosen by default
based on what is specified in the Thermochemistry_parameters
module.
Parameters
----------
None
Returns
-------
None
See Also
--------
TkThermochemistry.reset_dialog
"""
frame = super().create_dialog(title="Thermochemistry")
# Shortcut for parameters
P = self.node.parameters
# Frame to isolate widgets
thermo_frame = self["thermochemistry"] = ttk.LabelFrame(
frame,
borderwidth=4,
relief="sunken",
text="Thermochemistry",
labelanchor="n",
padding=10,
)
# Then create the widgets
for key in psi4_step.ThermochemistryParameters.parameters:
self[key] = P[key].widget(thermo_frame)
# and binding to change as needed
for key in ("use existing parameters",):
self[key].combobox.bind("<<ComboboxSelected>>", self.reset_dialog)
self[key].combobox.bind("<Return>", self.reset_dialog)
self[key].combobox.bind("<FocusOut>", self.reset_dialog)
# Top level needs to call reset_dialog
if self.node.calculation == "thermochemistry":
self.reset_dialog()
return frame
[docs]
def edit(self):
"""Present a dialog for editing this step's parameters.
Look at the flowchart to see if a previous step was a calculation.
"""
previous = self.node.previous()
self.first_calculation = isinstance(previous, psi4_step.Initialization)
super().edit()
if self.first_calculation:
self["use existing parameters"].set("no")
[docs]
def reset_dialog(self, widget=None, row=0):
"""Layout the widgets in the dialog.
The widgets are chosen by default from the information in
Thermochemistry_parameter.
This function simply lays them out row by row with
aligned labels. You may wish a more complicated layout that
is controlled by values of some of the control parameters.
If so, edit or override this method
Parameters
----------
widget : Tk Widget = None
Returns
-------
None
See Also
--------
TkThermochemistry.create_dialog
"""
# Remove any widgets previously packed
frame = self["frame"]
if row == 0:
for slave in frame.grid_slaves():
slave.grid_forget()
self["thermochemistry"].grid(row=row, column=0)
row += 1
self.reset_thermochemistry()
if self.first_calculation or self["use existing parameters"].get() != "yes":
row = super().reset_dialog(row=row)
self.fit_dialog()
return row
[docs]
def reset_thermochemistry(self, widget=None):
frame = self["thermochemistry"]
for slave in frame.grid_slaves():
slave.grid_forget()
widgets = []
row = 0
if not self.first_calculation:
self["use existing parameters"].grid(row=row, column=0, sticky=tk.EW)
widgets.append(self["use existing parameters"])
row += 1
for key in ("T", "P"):
self[key].grid(row=row, column=0, sticky=tk.EW)
widgets.append(self[key])
row += 1
sw.align_labels(widgets)