I had a request in the support communities late spring this year to provide a pop-up dialog informing the user when their battery level was below a specified percentage. It was implemented as a Launch Agent, rather than a Launch Daemon, because the latter suppresses GUI responses. The Launch Agent runs every 15 minutes, and passes the low water mark battery level as an integer to the Bash script that it executes. I stuck the .plist and .sh files in ~/Library/LaunchAgents, and a simple logout/login was all that was necessary to start the agent.
The Bash script compares the passed integer value to the current battery level, and using a Python HERE document, launches a custom PyObjC Alert dialog reminding the user to plug in their charger. Otherwise, the Bash script exits.
This means that you can place graphical (Tk, PyObjC, osascript) dialogs at strategic locations in your Python script to show progress when it runs, or create a non-GUI Python logging function to write progress to a Desktop file.