Python 如何在pygtk中运行单独的线程
我有一个pygtk应用程序,它在打开python脚本后立即运行。除了gtk.main()之外,我还有一个从脚本开头开始的线程,它刷新gtk.TextView()实例:Python 如何在pygtk中运行单独的线程,python,multithreading,textview,gtk,pygtk,Python,Multithreading,Textview,Gtk,Pygtk,我有一个pygtk应用程序,它在打开python脚本后立即运行。除了gtk.main()之外,我还有一个从脚本开头开始的线程,它刷新gtk.TextView()实例: def listen(self): while True: print "refreshing" data = self.socket.recv(buffer_size) if data: self.txtBuffer.insert(self.txtB
def listen(self):
while True:
print "refreshing"
data = self.socket.recv(buffer_size)
if data:
self.txtBuffer.insert(self.txtBuffer.get_end_iter(), data + "\n")
print data
thread.start_new_thread(self.listen, ())
self.set_up_gui() # gtk.main()
但是,当我运行程序时,gui会打开,但不会打印“刷新”文本,发送到套接字时也不会打印任何数据。我曾尝试使用glib.add_idle()来执行这个程序,但是它只在gui空闲时运行单独的线程(这种情况很少发生)。谢谢大家! 您正在从不同的线程访问文本缓冲区,而不进行任何同步,这是不受支持的。要解决此问题,请将
self.txtBuffer.insert(…)
替换为gobject.idle\u add(lambda:self.txtBuffer.insert(…)
。这会告诉GUI线程在下一次主循环迭代时更新文本缓冲区,这保证在没有显式同步的情况下工作
您应该确保GUI线程未被阻止,即它正在运行gtk.main()
,并且只处理GUI更新,例如上面的textBuffer.insert
。长时间运行/阻塞任务应该委托给其他线程或进程,就像您的代码已经尝试做的那样。实现此功能后,GUI更新似乎会立即发生
有关PyGTK和线程的更多详细信息,请参阅。GUI运行良好,但是数据仍然没有刷新。数据也没有收到,因为打印数据编辑没有打印任何内容:在我看来,GUI根本不允许线程运行修复了它,只是必须正确地实现您的解决方案,非常感谢!