当回调花费太长时间时,如何使PyGTK小部件快速响应?

时间:2011-06-27 10:10:17

标签: python gtk pygtk

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

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

def _init(self, w):
....

如何在处理过程中使GUI更具响应性?

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

2 个答案:

答案 0 :(得分:2)

您有几种解决方案:

  1. 在工作线程中进行计算,该工作线程将结果发送到主线程。但是不要更改工作线程中的GUI项。像大多数工具包一样,GTK不是线程安全的。我真的不喜欢那个,因为我不喜欢线程,因为它们往往会使调试变得更难......
  2. 将处理拆分为空闲句柄。当我说分裂时,我的意思是将它分成几个步骤,这需要更少的时间来计算。您应该使用具有多个状态的自动机,每个状态花费的时间要少得多。在空闲处理程序中放入一个大的微积分就像在该处理程序中调用sleep(5):GUI消息泵将被阻塞5秒,无法处理重绘事件......这是一个example of lazy loading数据使用这种技术。
  3. 使用gtk_main_iteration定期调用消息泵。
  4. 我给你的例子是C语言,但是python中的精神是一样的。

答案 1 :(得分:-1)

在处理程序中,将init的其余部分注册为idle-handler并返回。 gtk.idle_add IIRC。这样它将在处理gui事件后运行。检查文档以查看需要返回的值,以便不再重新启动该功能。