Python 当回调时间过长时,如何使PyGTK小部件快速响应?

Python 当回调时间过长时,如何使PyGTK小部件快速响应?,python,gtk,pygtk,Python,Gtk,Pygtk,我在_init回调函数中执行了一个耗时的处理。因此,在GUI上,当我激活check按钮时,程序冻结,同时处理运行到完成,然后出现复选标记,执行恢复正常 self.init = gtk.CheckButton("Init", False) self.init.connect("toggled", self._init) def _init(self, w): .... 如何使GUI在处理过程中更具响应性 有没有办法让GUI在开始时更改复选框的状态,然后进入重循环?在处理程序中,将init的其余

我在_init回调函数中执行了一个耗时的处理。因此,在GUI上,当我激活check按钮时,程序冻结,同时处理运行到完成,然后出现复选标记,执行恢复正常

self.init = gtk.CheckButton("Init", False)
self.init.connect("toggled", self._init)

def _init(self, w):
....
如何使GUI在处理过程中更具响应性


有没有办法让GUI在开始时更改复选框的状态,然后进入重循环?

在处理程序中,将init的其余部分注册为空闲处理程序并返回<代码>gtk.怠速添加IIRC。这样,它将在处理gui事件后运行。查看文档,查看需要返回的值,以便该函数不会再次启动。

您有几种解决方案:

  • 在工作线程中进行计算,工作线程将结果发送到主线程。但不要更改工作线程中的GUI项。像大多数工具包一样,GTK不是线程安全的。我真的不喜欢那个,因为我真的不喜欢线程,因为它们会使调试变得更困难
  • 在空闲句柄中拆分处理。当我说split时,我真正的意思是将它分成几个步骤,这些步骤花费的计算时间要少得多。您应该使用具有多个状态的自动机,每个状态占用的时间要少得多。在一个空闲的处理程序中放入一个巨大的微积分就像在该处理程序中调用sleep(5):GUI消息泵将被阻塞5秒钟,无法处理重绘事件。。。这是一个使用这种技术的数据
  • 使用强制定期调用消息泵

  • 我给你的例子是C语言的,但是python的精神是一样的。

    感谢liberforce提供了详细的答案。方法3是最快实现的方法。它做得很好。