Source code for reacnetgenerator.gui

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# SPDX-License-Identifier: LGPL-3.0-or-later
# cython: language_level=3
# cython: linetrace=True
"""GUI version of ReacNetGenerator."""

import base64
import os
import tkinter as tk
import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmb
import webbrowser
from multiprocessing import cpu_count

from . import ReacNetGenerator, __version__
from ._logging import logger


[docs] class GUI: """GUI class.""" def __init__(self): """Init GUI class.""" logger.info(__doc__) self._filename = "" self._top = tk.Tk() self._top.title(f"ReacNetGenerator {__version__}") self._top.columnconfigure(4, weight=2) self._filetype = tk.StringVar() self._filetype.set("lammpsbondfile") self._runhmm = tk.IntVar() self._runhmm.set(0) self._openpage = tk.IntVar() self._openpage.set(1) with open( os.path.join(os.path.dirname(__file__), "static", "img-title.png"), "rb" ) as f: imagedata = f.read() titleimage = tk.PhotoImage(data=base64.b64encode(imagedata).decode()) self._titlelb = tk.Label(self._top, image=titleimage) # self._titlelb.image = titleimage self._filenamelb = tk.Label(self._top, text="Trajectory File") self._filenameet = tk.Entry(self._top, width=45) self._openbtn = tk.Button( self._top, text="Select File", command=self._openfiles ) self._filetypelb = tk.Label(self._top, text="File Type") self._filetyperbbond = tk.Radiobutton( text="LAMMPS Bond file", value="lammpsbondfile", variable=self._filetype ) self._filetyperbtype = tk.Radiobutton( text="LAMMPS Dump file", value="lammpsdumpfile", variable=self._filetype ) self._runhmmcb = tk.Checkbutton( text="HMM Filter", variable=self._runhmm, onvalue=1, offvalue=0 ) self._openpagecb = tk.Checkbutton( text="Show Report", variable=self._openpage, onvalue=1, offvalue=0 ) self._atomnamelb = tk.Label(self._top, text="Atomic Symbol") self._atomnameet = tk.Entry(self._top, width=18) self._atomnameet.insert(0, "C H O") self._runbtn = tk.Button(self._top, text="Analyze", command=self._run) self._nproclb = tk.Label(self._top, text="Processor Number") self._nprocet = tk.Entry(self._top, width=4) self._nprocet.insert(0, str(cpu_count())) self._titlelb.grid(row=0, column=0, columnspan=8, padx=20, pady=20) self._filenamelb.grid(row=1, column=0, columnspan=2, padx=5, pady=5) self._filenameet.grid(row=1, column=2, columnspan=5, padx=5, pady=5) self._openbtn.grid(row=1, column=7, columnspan=1, padx=5, pady=5) self._filetypelb.grid(row=2, column=0, columnspan=2, padx=5, pady=5) self._filetyperbbond.grid(row=2, column=2, columnspan=2, padx=5, pady=5) self._filetyperbtype.grid(row=2, column=4, columnspan=2, padx=5, pady=5) self._atomnamelb.grid(row=3, column=0, columnspan=2, padx=5, pady=5) self._atomnameet.grid(row=3, column=2, columnspan=2, padx=5, pady=5) self._runhmmcb.grid(row=2, column=6, columnspan=2, padx=5, pady=5) self._openpagecb.grid(row=3, column=6, columnspan=3, padx=5, pady=5) self._runbtn.grid(row=4, column=0, columnspan=8, padx=10, pady=10) self._nproclb.grid(row=3, column=4, padx=5, pady=5) self._nprocet.grid(row=3, column=5, padx=5, pady=5)
[docs] def gui(self): """Start the GUI.""" self._top.mainloop()
@property def root(self): """Return the root of the GUI.""" return self._top def _run(self): filename = self._filenameet.get() if os.path.exists(filename): try: reacnetgenerator = ReacNetGenerator( inputfilename=self._filenameet.get(), inputfiletype=self._filetype.get(), atomname=self._atomnameet.get().split(), runHMM=(self._runhmm.get() == 1), nproc=int(self._nprocet.get()), ) reacnetgenerator.runanddraw() if self._openpage.get() == 1: webbrowser.open_new( os.path.abspath(reacnetgenerator.resultfilename) ) except Exception as e: logger.exception(e) tkmb.showerror("Error", str(e)) else: logger.error("File not exsit.") tkmb.showerror("Error", "File not exsit.") def _openfiles(self): self._filename = tkfd.askopenfilename() if self._filename != "": self._filenameet.delete(0, tk.END) self._filenameet.insert(0, self._filename)
[docs] def gui(): """Open GUI version of ReacNetGenerator.""" GUI().gui()