Source code for thermal_conductivity_step.tk_thermal_conductivity

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

"""The graphical part of a Thermal Conductivity step"""

import pprint  # noqa: F401
import tkinter as tk
import tkinter.ttk as ttk

from .thermal_conductivity_parameters import ThermalConductivityParameters
import seamm
from seamm_util import ureg, Q_, units_class  # noqa: F401
import seamm_widgets as sw


[docs] class TkThermalConductivity(seamm.TkNode): """ The graphical part of a Thermal Conductivity 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 Thermal Conductivity_parameters.py See Also -------- ThermalConductivity, TkThermalConductivity, ThermalConductivityParameters, """ def __init__( self, tk_flowchart=None, node=None, namespace="org.molssi.seamm.tk", 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.namespace = namespace self.dialog = None super().__init__( tk_flowchart=tk_flowchart, node=node, canvas=canvas, x=x, y=y, w=w, h=h, ) self.create_dialog()
[docs] def create_dialog(self): """ Create the dialog. A set of widgets will be chosen by default based on what is specified in the Thermal Conductivity_parameters module. Parameters ---------- None Returns ------- None See Also -------- TkThermalConductivity.reset_dialog """ frame = super().create_dialog(title="Thermal Conductivity", widget="notebook") # make it large! screen_w = self.dialog.winfo_screenwidth() screen_h = self.dialog.winfo_screenheight() w = int(0.9 * screen_w) h = int(0.8 * screen_h) x = int(0.05 * screen_w / 2) y = int(0.1 * screen_h / 2) self.dialog.geometry(f"{w}x{h}+{x}+{y}") # Add a frame for the flowchart notebook = self["notebook"] flowchart_frame = ttk.Frame(notebook) self["flowchart frame"] = flowchart_frame notebook.add(flowchart_frame, text="Flowchart", sticky=tk.NSEW) self.tk_subflowchart = seamm.TkFlowchart( master=flowchart_frame, flowchart=self.node.subflowchart, namespace=self.namespace, ) self.tk_subflowchart.draw() # Fill in the control parameters # Shortcut for parameters P = self.node.parameters # conductivity frame to isolate widgets frame = self["conductivity_frame"] = ttk.LabelFrame( self["frame"], borderwidth=4, relief="sunken", text="Thermal Conductivity", labelanchor="n", padding=10, ) for key in ThermalConductivityParameters.parameters: self[key] = P[key].widget(frame) # and binding to change as needed self["approach"].combobox.bind( "<<ComboboxSelected>>", self.reset_conductivity_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 Thermal Conductivity_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 -------- TkThermalConductivity.create_dialog """ row = 0 self["conductivity_frame"].grid(row=row, column=0, sticky=tk.EW, pady=10) row += 1 self.reset_conductivity_frame() return row
[docs] def reset_conductivity_frame(self, widget=None): """Layout the widgets in the conductivity frame as needed for the current state""" approach = self["approach"].get() frame = self["conductivity_frame"] for slave in frame.grid_slaves(): slave.grid_forget() row = 0 # Main controls widgets = [] for key in ("approach", "T", "nruns", "errors"): self[key].grid(row=row, column=0, columnspan=2, sticky=tk.W) widgets.append(self[key]) row += 1 widgets0 = [] if "RNEMD" in approach: for key in ("nlayers", "swap frequency", "n to swap"): self[key].grid(row=row, column=1, sticky=tk.W) widgets0.append(self[key]) row += 1 elif "Thermostatted" in approach: for key in ("nlayers", "deltaT"): self[key].grid(row=row, column=1, sticky=tk.W) widgets0.append(self[key]) row += 1 elif "Heat Removal" in approach: for key in ("nlayers", "ehex"): self[key].grid(row=row, column=1, sticky=tk.W) widgets0.append(self[key]) row += 1 sw.align_labels(widgets, sticky=tk.E) if len(widgets0) > 0: sw.align_labels(widgets0, sticky=tk.E) frame.columnconfigure(0, minsize=50)
[docs] def right_click(self, event): """ Handles the right click event on the node. Parameters ---------- event : Tk Event Returns ------- None See Also -------- TkThermalConductivity.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)