Source code for quickmin_step.tk_quickmin
# -*- coding: utf-8 -*-
"""The graphical part of a QuickMin step"""
import pprint # noqa: F401
import tkinter as tk
# from openbabel import openbabel
import quickmin_step # noqa: F401
import seamm
from seamm_util import ureg, Q_, units_class # noqa: F401
import seamm_widgets as sw
[docs]
class TkQuickMin(seamm.TkNode):
"""
The graphical part of a QuickMin step in a flowchart.
Parameters
----------
tk_flowchart : TkFlowchart = None
The flowchart that we belong to.
node : Node = None
The corresponding node of the non-graphical flowchart
namespace : str
The namespace of the current step.
tk_subflowchart : TkFlowchart
A graphical Flowchart representing a subflowchart
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 QuickMin_parameters.py
See Also
--------
QuickMin, TkQuickMin,
QuickMinParameters,
"""
def __init__(
self,
tk_flowchart=None,
node=None,
canvas=None,
x=None,
y=None,
w=200,
h=50,
):
"""
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
super().__init__(
tk_flowchart=tk_flowchart,
node=node,
canvas=canvas,
x=x,
y=y,
w=w,
h=h,
)
[docs]
def create_dialog(self):
"""
Create the dialog. A set of widgets will be chosen by default
based on what is specified in the QuickMin_parameters
module.
Parameters
----------
None
Returns
-------
None
See Also
--------
TkQuickMin.reset_dialog
"""
frame = super().create_dialog(title="QuickMin")
# Shortcut for parameters
P = self.node.parameters
# Then create the widgets
for key in P:
if key[0] != "_" and key not in (
"results",
"extra keywords",
"create tables",
"subsequent structure handling",
):
self[key] = P[key].widget(frame)
# and binding to change as needed
self["calculation"].combobox.bind("<<ComboboxSelected>>", self.reset_dialog)
# and lay them out
self.reset_dialog()
[docs]
def reset_dialog(self, widget=None):
"""Layout the widgets in the dialog.
The widgets are chosen by default from the information in
QuickMin_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
--------
TkQuickMin.create_dialog
"""
# Remove any widgets previously packed
frame = self["frame"]
for slave in frame.grid_slaves():
slave.grid_forget()
# keep track of the row in a variable, so that the layout is flexible
# if e.g. rows are skipped to control such as "calculation" here
calculation = self["calculation"].get()
row = 0
widgets = []
for key in ("forcefield", "calculation"):
self[key].grid(row=row, column=0, sticky=tk.EW)
widgets.append(self[key])
row += 1
if calculation == "optimization":
for key in ("n_steps",):
self[key].grid(row=row, column=0, sticky=tk.EW)
widgets.append(self[key])
row += 1
# Align the labels
sw.align_labels(widgets, sticky=tk.E)
# Setup the results if there are any
self.setup_results()
[docs]
def right_click(self, event):
"""
Handles the right click event on the node.
Parameters
----------
event : Tk Event
Returns
-------
None
See Also
--------
TkQuickMin.edit
"""
super().right_click(event)
self.popup_menu.add_command(label="Edit..", command=self.edit)
self.popup_menu.tk_popup(event.x_root, event.y_root, 0)