Created
November 14, 2018 16:04
-
-
Save eyllanesc/72a67e76350691012580f2207f1dd12b to your computer and use it in GitHub Desktop.
53288877
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import time | |
import logging | |
import multiprocessing | |
import threading | |
from PySide2 import QtCore, QtWidgets | |
def long_task(): | |
logging.info('Starting long task') | |
time.sleep(3) # this would be replaced with a real task | |
logging.info('Long task complete') | |
class LogEmitter(QtCore.QObject): | |
sigLog = QtCore.Signal(str) | |
class LogHandler(logging.Handler): | |
def __init__(self): | |
super().__init__() | |
self.r, self.w = multiprocessing.Pipe() | |
self.emitter = LogEmitter() | |
threading.Thread(target=self.listen, daemon=True).start() | |
def emit(self, record): | |
msg = self.format(record) | |
self.w.send(msg) | |
def listen(self): | |
while True: | |
try: | |
msg = self.r.recv() | |
self.emitter.sigLog.emit(msg) | |
except EOFError: | |
break | |
class LogDialog(QtWidgets.QDialog): | |
def __init__(self, parent=None): | |
super().__init__(parent) | |
log_txt = QtWidgets.QPlainTextEdit(self) | |
log_txt.setReadOnly(True) | |
layout = QtWidgets.QHBoxLayout(self) | |
layout.addWidget(log_txt) | |
self.setWindowTitle('Event Log') | |
handler = LogHandler() | |
handler.emitter.sigLog.connect(log_txt.appendPlainText) | |
logger = logging.getLogger() | |
logger.addHandler(handler) | |
logger.setLevel(logging.INFO) | |
class MainWindow(QtWidgets.QMainWindow): | |
def __init__(self): | |
super().__init__() | |
widget = QtWidgets.QWidget() | |
layout = QtWidgets.QHBoxLayout(widget) | |
start_btn = QtWidgets.QPushButton('Start') | |
start_btn.clicked.connect(self.start) | |
layout.addWidget(start_btn) | |
self.setCentralWidget(widget) | |
self.log_dialog = LogDialog() | |
self.pool = multiprocessing.Pool() | |
self.running = False | |
def start(self): | |
if not self.running: | |
self.log_dialog.show() | |
logging.info('Run Starting') | |
self.pool.apply_async(long_task, callback=self.handle_result) | |
def handle_result(self, result=None): | |
logging.info('Result received') | |
self.running = False | |
if __name__ == '__main__': | |
app = QtWidgets.QApplication() | |
win = MainWindow() | |
win.show() | |
sys.exit(app.exec_()) |
Author
eyllanesc
commented
Nov 14, 2018
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment