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)