<p>subprocess模块是可选的,但棘手的部分是跟踪输出与gtk的主循环不平行,要实现这个目标,必须考虑您正在处理的平台,如果您在linux中,您可以轻松地运行另一个线程并使用<code>gtk.gdk.threads_init</code>在pygtk中使用线程,但是如果您计划在windows上运行应用程序,那么应该使用<strong>生成器</strong>和<strong>gobject.idle_添加</strong>。</p>
<p>关于小部件,请使用与<code>gtk.TextView</code>关联的<code>gtk.TextBuffer</code></p>
<p>下面是一个线程示例</p>
<pre><code>import gtk
import subprocess
import threading
gtk.gdk.threads_init()
class FollowProcess(threading.Thread):
def __init__(self, cmd, text_buffer):
self.tb = text_buffer
self.child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
super(FollowProcess, self).__init__()
def run(self):
while not self.child.poll():
out = self.child.stdout.read(1)
if out != '':
gtk.gdk.threads_enter()
self.tb.insert_at_cursor(out)
gtk.gdk.threads_leave()
def destroy(w, cmd):
cmd.child.terminate()
gtk.main_quit()
i = 0
def click_count(btn):
global i
message.set_text('Calling button %d' %i)
i += 1
other_command = 'python extranger.py'
w = gtk.Window()
w.resize(400, 400)
message = gtk.Label('Nothing')
tb = gtk.TextBuffer()
tv = gtk.TextView(tb)
scroll = gtk.ScrolledWindow()
scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scroll.add(tv)
box = gtk.VBox()
button = gtk.Button('Active button')
cmd = FollowProcess('python extranger.py', tb)
button.connect('clicked', click_count )
w.connect('destroy', destroy, cmd)
box.pack_start(button, False)
box.pack_start(message, False)
box.pack_start(scroll)
w.add(box)
w.show_all()
cmd.start()
gtk.main()
</code></pre>
<p>在<code>extranger.py</code></p>
^{pr2}$
<p>请注意,即使在并行更新的情况下,按钮仍然会响应。</p>