读取导入类的打印值

2024-10-03 11:24:05 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是非常基本的,但它让我头痛,我甚至不知道用什么方法来处理它,使谷歌艰难。你知道吗

如果我在一个模块中有一个类,我正在导入其中的各种打印,那么如何在打印出来时读取这些打印,以便将它们输出到PyQT文本标签?你知道吗

class Worker(QtCore.QThread, object):
    class statusWrapper(object):
        def __init__(self, outwidget):
            self.widget = outwidget

        def write(self, s):
            self.widget.setText(s)

    def __init__(self, widget):
        QtCore.QThread.__init__(self)
        sys.stdout = statusWrapper(widget)

    def run(self):
        self.runModule() #This is the module with the prints within.

一些神秘的东西传给了状态包装器.写入当runModule被执行时,它是空的。我做错什么了?你知道吗

谢谢。你知道吗


Tags: 模块the方法selfobjectinitdefwidget
3条回答

您可以使用StringIO对象作为标准输出,而不是编写自己的statusWrapper类。比如:

def __init__(self, widget):
    QtCore.QThread.__init__(self)

def run(self):
    real_stdout = sys.stdout
    sys.stdout = StringIO.StringIO()
    self.runModule()
    label_text = sys.stdout.getvalue()
    sys.stdout = real_stdout

恢复stdout的原始值对您的理智很重要。还要注意的是,在多线程环境中,这不会达到预期的效果。另外请注意,delnan肯定是正确的,替换stdout是一种令人难以置信的黑客方式。你知道吗

如果您希望在每次模块打印输出时更新标签(有点像穷人的状态指示器),那么也有更好的方法可以做到这一点-您可以用调用回调函数来替换打印,在导入时在模块中设置回调函数,或者类似的方法。你知道吗

最简单的方法(仍然是错误的-正确的方法是更改函数)是将stdout重定向到标签(打印写入)系统标准输出). 请参见Wxwidgets and Pyqt以获取一个简单的QPlainTextEdit示例,对于QLabel应该很容易调整。你知道吗

Something mysterious gets passed to the statusWrapper.write when runModule gets executed, but it's blank. What am I doing wrong?

这并不神秘:write只接收写入sys.stdout的每个字符串(在本例中是包装器)。你知道吗

错误可能是包装器只调用setText在每次写入时替换小部件的文本,而不是附加到它。你至少需要做以下事情:

    def write(self, s):
        self.widget.setText(self.widget.text() + s)

(或者更有效的方法是将文本附加到QT小部件)。你知道吗

注:

重定向sys.stdout的更好方法是使用上下文管理器。PEP 343定义以下示例:

from contextlib import contextmanager

@contextmanager
def stdout_redirected(new_stdout):
    save_stdout = sys.stdout
    sys.stdout = new_stdout
    try:
        yield None
    finally:
        sys.stdout = save_stdout

你可以这样使用它:

class Worker(QtCore.QThread, object):

    def run(self):
        with stdout_redirected(StatusWrapper(widget)):
            self.runModule()

除了更具可读性之外,这个上下文管理器还确保系统标准输出如果runModule引发了一个异常(这对您的理智很重要:-)。你知道吗

相关问题 更多 >