如何将 tqdm 文本内容流式传输到 PySide2 GUI?

问题描述 投票:0回答:1

我正在使用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 仅显示正常的白色文本打印语句。谢谢你

python user-interface pyside2 tqdm jmetalpy
1个回答
0
投票

您遇到的问题似乎可能是由于与常规打印语句相比处理 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)

© www.soinside.com 2019 - 2024. All rights reserved.