这可能是非常基本的,但它让我头痛,我甚至不知道用什么方法来处理它,使谷歌艰难。你知道吗
如果我在一个模块中有一个类,我正在导入其中的各种打印,那么如何在打印出来时读取这些打印,以便将它们输出到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被执行时,它是空的。我做错什么了?你知道吗
谢谢。你知道吗
您可以使用StringIO对象作为标准输出,而不是编写自己的statusWrapper类。比如:
恢复stdout的原始值对您的理智很重要。还要注意的是,在多线程环境中,这不会达到预期的效果。另外请注意,delnan肯定是正确的,替换stdout是一种令人难以置信的黑客方式。你知道吗
如果您希望在每次模块打印输出时更新标签(有点像穷人的状态指示器),那么也有更好的方法可以做到这一点-您可以用调用回调函数来替换打印,在导入时在模块中设置回调函数,或者类似的方法。你知道吗
最简单的方法(仍然是错误的-正确的方法是更改函数)是将stdout重定向到标签(打印写入)系统标准输出). 请参见Wxwidgets and Pyqt以获取一个简单的QPlainTextEdit示例,对于QLabel应该很容易调整。你知道吗
这并不神秘:
write
只接收写入sys.stdout
的每个字符串(在本例中是包装器)。你知道吗错误可能是包装器只调用
setText
,在每次写入时替换小部件的文本,而不是附加到它。你至少需要做以下事情:(或者更有效的方法是将文本附加到QT小部件)。你知道吗
注:
重定向
sys.stdout
的更好方法是使用上下文管理器。PEP 343定义以下示例:你可以这样使用它:
除了更具可读性之外,这个上下文管理器还确保系统标准输出如果
runModule
引发了一个异常(这对您的理智很重要:-)。你知道吗相关问题 更多 >
编程相关推荐