Source code for prsctrl_gui.init
"""Initialize the GUI"""
from PyQt6.QtCore import Qt
from pyqtgraph.Qt import App
from PyQt6.QtGui import QIcon, QStyleHints
from PyQt6.QtWidgets import QApplication
from .gui.main_window import MainWindow
from .utility.config import AppConfig
import signal
import logging
log = logging.getLogger(__name__)
from . import resources
# This is necessary to set the taskbar icon
import ctypes
try:
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(u'n205.prsctrl-gui.1')
except:
pass # not windows
t_last_interrupt = 0
n_interrupts = 0
[docs]
def run() -> int:
"""
Initializes the application and runs it.
Returns:
int: The exit status code.
"""
log.debug("Starting App")
for p in reversed(AppConfig.MAIN_CFG.system_path_append):
sys.path.insert(0, p)
app: QApplication = QApplication(sys.argv)
# use dark mode icons if system is in dark mode
# stylehints = app.styleHints()
# if stylehints:
# color_scheme = Qt.ColorScheme(stylehints.colorScheme())
# if color_scheme == Qt.ColorScheme.Dark:
# import devctrl.resources
# devctrl.resources.set_dark_mode()
icon_path = resources.get_resource_path("icons/icon.png")
app.setWindowIcon(QIcon(icon_path))
log.debug("Loading languages")
language = AppConfig.MAIN_CFG.app_language
# check core language, e.g. "de" if language is "de_DE"
if len(language) > 2:
core_translator = QtCore.QTranslator()
core_lang = language[:2]
if core_translator.load(core_lang, directory="translation"):
log.info(f"Core language is {core_translator.language()}; loaded translations from {core_translator.filePath()}")
else:
log.error(f"Failed to load core translation '{language}'")
app.installTranslator(core_translator)
translator = QtCore.QTranslator()
if translator.load(language, directory="translation"):
log.info(f"Language is {translator.language()}; loaded translations from {translator.filePath()}")
else:
log.error(f"Failed to load translation '{language}'")
app.installTranslator(translator)
log.debug(f"Translator: {translator.translate("PrsGuiSettings", "modes")}")
log.debug(f"QCoreApp: {QtCore.QCoreApplication.translate("PrsGuiSettings", "modes")}")
window: MainWindow = MainWindow()
window.show()
# Close app on keyboard interrupt, force close on two subsequent interrupts
import time
def interrupt_handler(*args):
global t_last_interrupt, n_interrupts
log.debug(f"Interrupt requested")
if n_interrupts > 2:
log.warning(f"Multiple interrupts - killing app.")
import os
return os._exit(1)
if time.time() - t_last_interrupt < 5:
n_interrupts += 1
log.warning(f"Two interrupts - force quitting app")
window.app_exit()
app.quit()
AppConfig.finalize()
return sys.exit(1)
t_last_interrupt = time.time()
window.app_exit()
app.quit()
signal.signal(signal.SIGINT, interrupt_handler)
exitcode = app.exec()
log.info("Saving configuration")
AppConfig.finalize()
return exitcode
import sys
import traceback
from PyQt6 import QtCore, QtWidgets
from os import path, makedirs
from devctrl.utility.log import ColorFormatter, PackageFilter
from devctrl.utility.file_io import get_date_for_filename
AppConfig.initialize()
# Init logging
log_dir = AppConfig.get_path(AppConfig.MAIN_CFG.log_dir)
makedirs(log_dir, exist_ok=True)
log_path = path.join(log_dir, get_date_for_filename() + "_prsctrl-gui.log")
log_format = "%(asctime)s [%(levelname)s] [%(name)s/%(funcName)s] %(message)s"
log_stdout = logging.StreamHandler()
log_stdout.setFormatter(ColorFormatter(log_format))
PackageFilter.DEBUG_FOR_PKG = ["prsctrl_gui", "prsctrl", "devctrl", "__main__", "mqutil"]
log_stdout.addFilter(PackageFilter())
log_file = logging.FileHandler(log_path)
log_file.addFilter(PackageFilter())
log_file.setFormatter(logging.Formatter(log_format))
logger = logging.getLogger() # root logger
logger.addHandler(log_stdout)
logger.addHandler(log_file)
logger.setLevel(logging.DEBUG)
from devctrl.gui.exception import UncaughtExceptionHook, UncaughtWarningHook
if AppConfig.MAIN_CFG.error_show_dialog:
qt_exception_hook = UncaughtExceptionHook(show_traceback=AppConfig.MAIN_CFG.error_stack_trace)
# qt_warning_hook = UncaughtWarningHook()