是这样的,我用 pyqt5 写了一个 gui 程序,在主线程中用 multiprocessing 启动新的进程执行一些任务。现在我想把这个子进程的 log 输出到 ui 上,采用了添加 logging.Handler 的方式获取子进程的 log ,然后写入到 ui 中。但是问题来了,由于 qt 的进程安全机制,明明已经获取到 log 了,但是它就是不让我输出到 ui 中,通过 print 的方式是可以显示的。
所以想问下各位大神,我需要怎么做才能让它把 log 写到 ui 中?
代码大概是这样的:
class MyLogHandler(logging.Handler): def __init__(self, obj): logging.Handler.__init__(self) self.Object = obj def emit(self, record): if record.levelno<self.level: return tstr = time.strftime('%Y-%m-%d %H:%M:%S.%U') self.Object.append("[%s][%s] %s"%(tstr, record.levelname, record.getMessage())) self.Object.moveCursor(QtGui.QTextCursor.End) mySW = MainWindow() handler = MyLogHandler(mySW.loggingBrowser) logging.getLogger().addHandler(handler) multiprocessing.Process(pass).start() 其中的 loggingBrowser就是 log 显示组件。由于 logging 是模块级别的,因此主线程中的MyLogHandler 可以捕获到子进程的 log 输出。
补充:
当然,如果用多线程的话是可以的,但是不管是python的多线程还是qt的多线程,都存在无法强制结束子线程的问题。所以只能用多进程了。
