def excepthook(exc_type, exc_value, exc_tb): traceback_ = ''.join( traceback.format_exception(exc_type, exc_value, exc_tb)) err_msg = f'An unhandled exception has occurred:\n {traceback_}' manager_logger.error(err_msg) err_msg = err_msg.replace('\n', '<br>') error_dialog = QErrorMessage() error_dialog.setWindowTitle('HLM PV Import - Error') error_dialog.resize(600, 300) error_dialog.setFont(QFont('Lucida Console', 9)) error_dialog.showMessage(err_msg) error_dialog.exec()
def showError(message): from PyQt5.QtWidgets import QErrorMessage, QCheckBox, \ QPushButton, QLabel, QStyle from PyQt5.QtCore import Qt app = QApplication(sys.argv) app.setQuitOnLastWindowClosed(True) # 设置内置错误图标 app.setWindowIcon(app.style().standardIcon(QStyle.SP_MessageBoxCritical)) w = QErrorMessage() w.finished.connect(lambda _: app.quit) w.resize(600, 400) # 去掉右上角? w.setWindowFlags(w.windowFlags() & ~Qt.WindowContextHelpButtonHint) w.setWindowTitle(w.tr('Error')) # 隐藏图标、勾选框、按钮 w.findChild(QLabel, '').setVisible(False) w.findChild(QCheckBox, '').setVisible(False) w.findChild(QPushButton, '').setVisible(False) w.showMessage(escape(message)) sys.exit(app.exec_())
def showError(message): from PyQt5.QtWidgets import QApplication, QErrorMessage, QCheckBox, \ QPushButton, QLabel, QStyle from PyQt5.QtCore import Qt app = QApplication(sys.argv) # 아이콘 설정 app.setWindowIcon(app.style().standardIcon(QStyle.SP_MessageBoxCritical)) w = QErrorMessage() w.finished.connect(lambda _: app.quit) w.resize(800, 400) # 아이콘과 이름 정함 w.setWindowFlags(w.windowFlags() & ~Qt.WindowContextHelpButtonHint) w.setWindowTitle(w.tr('Error')) # 에러 위젯에서 마크와 체크바 없에기 w.findChild(QLabel, '').setVisible(False) w.findChild(QCheckBox, '').setVisible(False) # w.findChild(QPushButton, '').setVisible(False) w.showMessage(escape(message)) sys.exit(app.exec_())
def main(sysArgs=None): """Parses command line, sets up logging, and launches main GUI. """ if sysArgs is None: sysArgs = sys.argv[1:] # Valid Input Options shortOpt = "hv" longOpt = [ "help", "version", "info", "debug", "verbose", "style=", "config=", "data=", "testmode", ] helpMsg = ( "novelWriter {version} ({date})\n" "{copyright}\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "Usage:\n" " -h, --help Print this message.\n" " -v, --version Print program version and exit.\n" " --info Print additional runtime information.\n" " --debug Print debug output. Includes --info.\n" " --verbose Increase verbosity of debug output. Includes --debug.\n" " --style= Sets Qt5 style flag. Defaults to 'Fusion'.\n" " --config= Alternative config file.\n" " --data= Alternative user data path.\n").format( version=__version__, copyright=__copyright__, date=__date__, ) # Defaults logLevel = logging.WARN logFormat = "{levelname:8} {message:}" confPath = None dataPath = None testMode = False qtStyle = "Fusion" cmdOpen = None # Parse Options try: inOpts, inRemain = getopt.getopt(sysArgs, shortOpt, longOpt) except getopt.GetoptError as E: print(helpMsg) print("ERROR: %s" % str(E)) sys.exit(2) if len(inRemain) > 0: cmdOpen = inRemain[0] for inOpt, inArg in inOpts: if inOpt in ("-h", "--help"): print(helpMsg) sys.exit(0) elif inOpt in ("-v", "--version"): print("novelWriter Version %s [%s]" % (__version__, __date__)) sys.exit(0) elif inOpt == "--info": logLevel = logging.INFO elif inOpt == "--debug": logLevel = logging.DEBUG logFormat = "[{asctime:}] {name:>22}:{lineno:<4d} {levelname:8} {message:}" elif inOpt == "--verbose": logLevel = VERBOSE logFormat = "[{asctime:}] {name:>22}:{lineno:<4d} {levelname:8} {message:}" elif inOpt == "--style": qtStyle = inArg elif inOpt == "--config": confPath = inArg elif inOpt == "--data": dataPath = inArg elif inOpt == "--testmode": testMode = True # Set Config Options CONFIG.cmdOpen = cmdOpen # Set Logging cHandle = logging.StreamHandler() cHandle.setFormatter(logging.Formatter(fmt=logFormat, style="{")) pkgLogger = logging.getLogger(__package__) pkgLogger.addHandler(cHandle) pkgLogger.setLevel(logLevel) logger.info("Starting novelWriter %s (%s) %s" % (__version__, __hexversion__, __date__)) # Check Packages and Versions errorData = [] errorCode = 0 if sys.hexversion < 0x030600f0: errorData.append("At least Python 3.6.0 is required, found %s." % CONFIG.verPyString) errorCode |= 4 if CONFIG.verQtValue < 50200: errorData.append("At least Qt5 version 5.2 is required, found %s." % CONFIG.verQtString) errorCode |= 8 if CONFIG.verPyQtValue < 50200: errorData.append("At least PyQt5 version 5.2 is required, found %s." % CONFIG.verPyQtString) errorCode |= 16 try: import lxml # noqa: F401 except ImportError: errorData.append("Python module 'lxml' is missing.") errorCode |= 32 if errorData: errApp = QApplication([]) errMsg = QErrorMessage() errMsg.resize(500, 300) errMsg.showMessage( ("<h3>A critical error has been encountered</h3>" "<p>novelWriter cannot start due to the following issues:<p>" "<p> - %s</p>" "<p>Shutting down ...</p>") % ("<br> - ".join(errorData))) for errMsg in errorData: logger.critical(errMsg) errApp.exec_() sys.exit(errorCode) # Finish initialising config CONFIG.initConfig(confPath, dataPath) if CONFIG.osDarwin: try: from Foundation import NSBundle bundle = NSBundle.mainBundle() info = bundle.localizedInfoDictionary() or bundle.infoDictionary() info["CFBundleName"] = "novelWriter" except ImportError as e: logger.error("Failed to set application name") logger.error(str(e)) # Import GUI (after dependency checks), and launch from nw.guimain import GuiMain if testMode: nwGUI = GuiMain() return nwGUI else: nwApp = QApplication([CONFIG.appName, ("-style=%s" % qtStyle)]) nwApp.setApplicationName(CONFIG.appName) nwApp.setApplicationVersion(__version__) nwApp.setWindowIcon(QIcon(CONFIG.appIcon)) nwApp.setOrganizationDomain(__domain__) # Connect the exception handler before making the main GUI sys.excepthook = exceptionHandler # Launch main GUI nwGUI = GuiMain() if not nwGUI.hasProject: nwGUI.showProjectLoadDialog() nwGUI.releaseNotes() sys.exit(nwApp.exec_())