Source code for strain_step.tk_strain

# -*- coding: utf-8 -*-

"""The graphical part of a Strain step"""

import pprint  # noqa: F401
import tkinter as tk

import strain_step  # noqa: F401
import seamm
from seamm_util import ureg, Q_, units_class  # noqa: F401
import seamm_widgets as sw


[docs]class TkStrain(seamm.TkNode): """ The graphical part of a Strain 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 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 Strain_parameters.py See Also -------- Strain, TkStrain, StrainParameters, """ 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 Strain_parameters module. Parameters ---------- None Returns ------- None See Also -------- TkStrain.reset_dialog """ frame = super().create_dialog(title="Strain") # Shortcut for parameters P = self.node.parameters # Then create the widgets for key in P: self[key] = P[key].widget(frame) # 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 Strain_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 -------- TkStrain.create_dialog """ # Remove any widgets previously packed frame = self["frame"] for slave in frame.grid_slaves(): slave.grid_forget() # Shortcut for parameters P = self.node.parameters # keep track of the row in a variable, so that the layout is flexible # if e.g. rows are skipped to control such as "method" here row = 0 widgets = [] for key in P: 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)
[docs] def right_click(self, event): """ Handles the right click event on the node. Parameters ---------- event : Tk Event Returns ------- None See Also -------- TkStrain.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)
[docs] def edit(self): """Present a dialog for editing the Strain input Parameters ---------- None Returns ------- None See Also -------- TkStrain.right_click """ if self.dialog is None: self.create_dialog() self.dialog.activate(geometry="centerscreenfirst")
[docs] def handle_dialog(self, result): """Handle the closing of the edit dialog What to do depends on the button used to close the dialog. If the user closes it by clicking the "x" of the dialog window, None is returned, which we take as equivalent to cancel. Parameters ---------- result : None or str The value of this variable depends on what the button the user clicked. Returns ------- None """ if result is None or result == "Cancel": self.dialog.deactivate(result) return if result == "Help": # display help!!! return if result != "OK": self.dialog.deactivate(result) raise RuntimeError(f"Don't recognize dialog result '{result}'") self.dialog.deactivate(result) # Shortcut for parameters P = self.node.parameters # Get the values for all the widgets. This may be overkill, but # it is easy! You can sort out what it all means later, or # be a bit more selective. for key in P: P[key].set_from_widget()
[docs] def handle_help(self): """Shows the help to the user when click on help button. Parameters ---------- None Returns ------- None """ print("Help not implemented yet for Strain!")