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()