crash_handler.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import logging
  2. from PyQt5.QtWidgets import *
  3. from PyQt5.QtGui import *
  4. from PyQt5.QtCore import *
  5. logger = logging.getLogger(__name__)
  6. def dump_error(out_path, error_msg):
  7. temp_dir = tempfile.mkdtemp()
  8. try:
  9. os.mkdir(os.path.join(temp_dir, 'output'))
  10. with open(os.path.join(temp_dir, 'output', 'error_msg.txt'), 'w') as f:
  11. f.write(error_msg)
  12. f.close()
  13. archive = zipfile.ZipFile(os.path.join(temp_dir, 'archive.zip'), 'w')
  14. try:
  15. archive.write(os.path.join(temp_dir, 'output', 'error_msg.txt'), '/error_msg.txt')
  16. finally:
  17. archive.close()
  18. shutil.move(os.path.join(temp_dir, 'archive.zip'), output_path)
  19. finally:
  20. shutil.rmtree(temp_dir)
  21. class CrashHandlerWindow(QWidget):
  22. exiting = pyqtSignal()
  23. def __init__(self, error_msg, title='Crash Handler - File Browser'):
  24. super().__init__()
  25. self.exiting.connect(self.destroy)
  26. layout = QVBoxLayout()
  27. self.setWindowTitle(title)
  28. self.message_label = QLabel('Oops! Something went wrong:')
  29. layout.addWidget(self.message_label)
  30. self.error_msg_display = QTextEdit()
  31. self.error_msg_display.setText(error_msg)
  32. self.error_msg_display.setReadOnly(True)
  33. layout.addWidget(self.error_msg_display)
  34. options_layout = QHBoxLayout()
  35. self.save_error_button = QPushButton('Save Error Information')
  36. self.save_error_button.clicked.connect(self.save_error)
  37. options_layout.addWidget(self.save_error_button)
  38. self.close_button = QPushButton('Exit')
  39. self.close_button.clicked.connect(lambda: self.exiting.emit())
  40. options_layout.addWidget(self.close_button)
  41. layout.addLayout(options_layout)
  42. self.setLayout(layout)
  43. def save_error(self):
  44. options = QFileDialog.Options()
  45. options |= QFileDialog.DontUseNativeDialog
  46. file_path, _ = QFileDialog.getSaveFileName(self, "Open file", "", "Archived Error Information (*.error);;Zip Archive (*.zip);;All Files (*)", options=options)
  47. if file_path:
  48. dump_error(file_path, error_msg)
  49. def closeEvent(self, event):
  50. self.exiting.emit()
  51. QWidget.closeEvent(self, event)