# -*- 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)