wxPython - HtmlWindow加载图片时冻结
我正在用wxPython写一个聊天室客户端,在一个笔记本页面上有三个wx.HtmlWindows
,分别用来显示每个聊天室的消息、房间标题和房间主题(这两个是相似的东西)。
这个程序运行得很好,当消息中有图片时也能正常加载。但是,当需要一次加载很多图片,或者加载一个需要更长时间的动画图片时,就会出现问题。因为有时候程序会卡住,导致它不响应,因为加载时间太长。我的问题是,怎样才能避免这种卡住的情况发生呢?我不知道怎么把wx.HtmlWindow
的图片加载绑定到一个工作线程上,这样程序就可以在加载图片的同时继续运行,而不必等到图片加载完才能继续。
如果你需要我正在写的代码示例,请告诉我。
编辑:我还是没找到解决办法……因为这个问题,我在这个项目上几乎没有进展。我的应用需要能够动态加载消息和图片,而不会卡住,但我就是不知道怎么把图片加载放到另一个线程里,这样可以在加载图片的同时显示消息和图片的框架,并在加载完成后更新这些框架。这一切都需要在HtmlWindow中完成。我希望它在加载图片时能像真正的网页浏览器一样(你可以看到框架,图片慢慢出现)。
4 个回答
你可能想试试最新的wxPython开发版本中的新功能?
首先,你需要确保已经下载并安装了最新版本。你可以在这里找到它,点击“开发版本”:http://www.wxpython.org/download.php
下面是一个简单的例子,适用于最新的wxPython(v2.9)开发版本:
import wx
import wx.html2
class MyBrowser(wx.Dialog):
def __init__(self, *args, **kwds):
wx.Dialog.__init__(self, *args, **kwds)
sizer = wx.BoxSizer(wx.VERTICAL)
self.browser = wx.html2.WebView.New(self)
sizer.Add(self.browser, 1, wx.EXPAND, 10)
self.SetSizer(sizer)
self.SetSize((700, 700))
if __name__ == '__main__':
app = wx.App()
dialog = MyBrowser(None, -1)
dialog.browser.LoadURL("http://www.google.com")
dialog.Show()
app.MainLoop()
希望这能解决你的问题,告诉我你的情况。
除了Mike的回答(他说的都适用),你还可以通过重写HTMLWindow中的OnOpeningURL方法来处理图片加载的情况,并指定类型为wx.html.HTML_URL_IMAGE
。
你可以查看这些wx文档来了解更多解释。
如果你的程序中有一些需要很长时间才能完成的任务,它们会让程序的主循环停下来,这样就会导致程序“卡住”。为了避免这种情况,你应该把下载的过程放在一个单独的线程里,这样主程序就可以继续运行。当下载完成后,再更新你的界面。下面有几个链接,里面讲了如何使用线程(还有其他方法),可能会对你有帮助:
http://wiki.wxpython.org/LongRunningTasks
http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/