Source code for stp.tools.gui

#!/usr/bin/env python3
"""GUI element handler.

**Author: Jonathan Delgado**

Handles creating GUI elements such a graphical loading bars for long processes.

"""
from tkinter import ttk
import tkinter as tk
import time

######################## GUI ########################

def _center_window(master, width, height):
        screen_width = master.winfo_screenwidth()
        screen_height = master.winfo_screenheight()
        # Calculate (x, y) coordinates for the Tk window
        x = (screen_width/2) - (width/2)
        y = (screen_height/2) - (height/2)
        # Set the dimensions of the screen and where it is placed
        master.geometry('%dx%d+%d+%d' % (width, height, x, y))


[docs]class ProgressBar: """ Tkinter progress bar. Object which will handle creating a Tkinter progress window for the purpose of showing as a graphical loading bar. Attributes: MAX_VALUE: the max value of steps before completing the bar. width: the width of the GUI bar. height: the height of the GUI bar. title: the window title. """ def __init__(self, MAX_VALUE, width=200, height=40, title='Loading...'): """ Initialize object to hold important quantities and create/style the bar. """ # Must know maximum to calculate percentages self._MAX_VALUE = MAX_VALUE # Initialize value property self.value = 0 # self.master = tk.Toplevel() self.master = tk.Tk() self.bar = ttk.Progressbar(self.master, orient=tk.HORIZONTAL, length=100, mode='determinate') self.width = width; self.height = height self.title = title self._style() _center_window(self.master, self.width, self.height) def _style(self): """ Handles designing the bar. """ self.bar.pack(fill='both', expand=True) self.set_title(self.title) self.master.style = ttk.Style() self.master.style.theme_use('classic')
[docs] def set_title(self, title): """ Updates the bar's title. Args: title (str): the new title. Returns: (None): none """ self.title = title self.master.wm_title(self.title)
[docs] def update(self, amount=1): """ Main function for interacting with the bar. Handles updating progress. Kwargs: amount (int): the amount to update the progress by. """ self.value += amount # print( f'Progress update counter: \n{self.value}' ) status = self.value / self._MAX_VALUE * 100 self.bar['value'] = status # time.sleep(1) # Uncomment to see the progress bar update slowly # Updates the window itself self.master.update()
[docs] def next(self): """ Mask for update to use same syntax in the case of using instead of ShadyBar for example. """ self.update()
[docs] def finish(self): """ Finishes the bar. Briefly shows it has been completed before safely destroying the Tkinter window. """ self.bar['value'] = 100 self.master.update() # Briefly show a completed bar time.sleep(0.2) # Close the window self.master.destroy()
#------------- Entry code -------------# def main(): print('gui.py') if __name__ == '__main__': main()