我在 pygtk 中遇到线程问题。我的应用程序包含一个从互联网下载图片然后用 pygtk 显示它的程序。问题是,为了做到这一点并保持 GUI 响应能力,我需要使用线程。
因此,在用户单击“下载图片”按钮后,我进入回调,并调用该方法来下载同一类中的图片。
thread.start_new_thread(self.images_download, (路径,页面)
这行不通。我让程序进入线程的唯一方法是使用
gtk.threads_init()
在开始任何线程之前。现在它下载了图片,但 GUI 仍然没有响应。
我用谷歌搜索了这个,并尝试将 gtk.threads_enter 和 gtk.threads_leave 放在线程周围,但它不起作用。
你的问题有点模糊,如果没有参考你的实际代码,很难推测你做错了什么。
所以我会给你一些阅读建议,然后根据经验进行大胆推测。
首先,您似乎认为只能通过使用线程来保持 GUI 的响应能力。这不是真的。您还可以异步编写代码,并在单线程应用程序中完成所有操作。Twisted http://twistedmatrix.com是建立在这个编程模型之上的。我最近发表了一篇博文 http://thomas.apestaart.org/log/?p=851这解释了我如何创建异步任务界面以及 CLI 和 GTK+ 的示例运行程序。您可以查看这些示例,了解如何异步实现任务,并且 UI 仍然会更新。
其次,如果您出于某种原因更喜欢使用线程,则需要稍微了解一下 GTK+ 线程模型。
你应该从阅读开始,你可能会发现这篇博文 http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html也很容易理解。
现在,开始猜测。我猜测您正在尝试从线程更新 GTK UI,并且没有正确处理锁定。如果是这种情况,您现在最好使用 gobject.idle_add() 将您想要执行的所有 UI 更新从线程推迟到主线程,这样,所有 UI 调用都将从主线程进行。这是一种在编程中更容易遵循的心理模型。
一旦您觉得自己真正理解了线程和锁定模型,您就可以考虑从线程更新 UI,但很容易错过threads_enter()/threads_leave()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)