<blockquote>
<p>Something mysterious gets passed to
the statusWrapper.write when runModule
gets executed, but it's blank. What am
I doing wrong?</p>
</blockquote>
<p>这并不神秘:<code>write</code>只接收写入<code>sys.stdout</code>的每个字符串(在本例中是包装器)。你知道吗</p>
<p>错误可能是包装器只调用<code>setText</code>,<em>在每次写入时替换</em>小部件的文本,而不是附加到它。你至少需要做以下事情:</p>
<pre><code> def write(self, s):
self.widget.setText(self.widget.text() + s)
</code></pre>
<p>(或者更有效的方法是将文本附加到QT小部件)。你知道吗</p>
<h2>注:</h2>
<p>重定向<code>sys.stdout</code>的更好方法是使用上下文管理器。<a href="http://www.python.org/dev/peps/pep-0343/" rel="nofollow" title="PEP 343 The "with" Statement">PEP 343</a>定义以下示例:</p>
<pre><code>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
</code></pre>
<p>你可以这样使用它:</p>
<pre><code>class Worker(QtCore.QThread, object):
def run(self):
with stdout_redirected(StatusWrapper(widget)):
self.runModule()
</code></pre>
<p>除了更具可读性之外,这个上下文管理器还确保系统标准输出如果<code>runModule</code>引发了一个异常(这对您的理智很重要:-)。你知道吗</p>