我正在使用jMetalPy。它有一个“ProgressBarObserver”,使用 tqdm 显示计算进度
https://github.com/jMetal/jMetalPy/blob/main/jmetal/util/observer.py
我有一个基于 PySide2 的 GUI,可以在 GUI 中打印控制台内容,令我惊讶的是,除了 tqdm 内容之外的所有内容都显示在 GUI 中
class EmittingStream(QtCore.QObject):
textWritten = Signal(str)
def write(self, text):
self.textWritten.emit(text)
def flush(self):
pass
......
# Console print
self.textBrowser = self.ui.textBrowser_log
# Create a custom stream object for the QTextBrowser.
self.textBrowserStream = EmittingStream()
self.textBrowserStream.textWritten.connect(self.textBrowser.append)
# Redirect output to the QTextBrowser, but not the output from pandas.
sys.stdout = self.textBrowserStream
pd.option_context('display.max_rows', None, 'display.max_columns', None, 'display.expand_frame_repr', False)
我正在使用 PyCharm,控制台以白色打印,但 tqdm 内容以红色打印,显然这个文本是不同的,可能需要以不同的方式处理。如何将其包含在我的文本流输出中? 为了进一步清晰起见,它在 PyCharm 中打印得很好,但 PySide2 GUI 仅显示正常的白色文本打印语句。谢谢你
您遇到的问题似乎可能是由于与常规打印语句相比处理 tqdm 输出的差异造成的。 tqdm 使用终端控制代码动态更新进度条,重定向到 QTextBrowser 时可能无法正确解释。
要在 PySide2 GUI 中处理 tqdm 输出,您需要单独拦截和处理 tqdm 的输出。一种方法是从 jMetalPy 继承 ProgressBarObserver 类,并重写其 on_progress_bar_update 方法以通过 tqdm 进度更新发出信号。然后,您可以将这些信号连接到 GUI 进行更新。
--- 将 tqdm 观察器添加到 GUI ----
tqdm_observer = TqdmProgressBarObserver() self.textBrowser.add_tqdm_observer(tqdm_observer)