This repository has been archived by the owner on Dec 17, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhost.pyw
119 lines (92 loc) · 3.69 KB
/
host.pyw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# -*- coding: utf-8 -*-
#Python utility "Demo Entry Point". Launches the corresponding Demo PyQt5 app. Copyright (C) 2023 Anna Anikina
#
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation, either version 3 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program. If not, see <http://www.gnu.org/licenses/>.
#---------------------------------------------------------------------------+++
# logging
import logging
log = logging.getLogger(__name__)
# embedded in python
import sys
import traceback
# pip install
# same project
# host app
from sparkling.host_app.pyqt5.HostApp import HostApp
# this variable will store the app
# currently unused
HOST_APPLICATION = None
class GuiLogHandler( logging.Handler ):
# I want to see logs in GUI. This handler
# attempts to do so.
# i will set it externally
# i expect `QPlainTextEdit`
label_widget = None
def __init__( self,
*args, **kwargs ):
super( GuiLogHandler, self ).__init__(
*args, **kwargs )
#self.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
def emit( self, record ):
msg = self.format( record )
if not self.label_widget is None:
#self.label_widget.setText( '\n'.join([ self.label_widget.text(),msg ]) )
self.label_widget.appendPlainText( msg )
def _custom_excepthook( ex_type, ex_value, ex_traceback ):
# I want to catch and log all unhandled exceptions - I want
# the app to keep running even when unknown errors occur.
# This function allows to do so, provided that the
# app initialised correctly.
# help:
# https://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python
# https://stackoverflow.com/questions/55819330/catching-exceptions-raised-in-qapplication
# make sure keyboard interrupt is accessible to
# user
if issubclass( ex_type, KeyboardInterrupt ):
sys.__excepthook__( ex_type, ex_value, ex_traceback )
return
# send the error traceback to all log handlers,
# so that my custom `GuiLogHandler` can receive it
# and add it to gui
text = '\n'.join( traceback.format_exception(ex_type,ex_value,ex_traceback) )
log.error( text )
# force show gui
HOST_APPLICATION.launch_exception_dialog()
# app keeps running as if nothing happened
def autorun():
# configure root logger
# and enable my custom handler
# help:
# https://stackoverflow.com/questions/59971542/add-custom-handler-to-log-root-level-with-logging-basicconfig
custom_handler = GuiLogHandler()
logging.basicConfig(
level=logging.ERROR,
#format=,
handlers=[
logging.StreamHandler(),
custom_handler,
]
)
# process unhandled exception how i want them
sys.excepthook = _custom_excepthook
# start the app
global HOST_APPLICATION
HOST_APPLICATION = HostApp( sys.argv, root_log_handler=custom_handler )
HOST_APPLICATION.mainloop_start()
print() # for breakpoint during debugging
if __name__ == '__main__':
autorun()
#---------------------------------------------------------------------------+++
# end 2023.10.14
# simplified