wxPython - HtmlWindow加载图片时冻结

1 投票
4 回答
705 浏览
提问于 2025-04-16 04:43

我正在用wxPython写一个聊天室客户端,在一个笔记本页面上有三个wx.HtmlWindows,分别用来显示每个聊天室的消息、房间标题和房间主题(这两个是相似的东西)。

这个程序运行得很好,当消息中有图片时也能正常加载。但是,当需要一次加载很多图片,或者加载一个需要更长时间的动画图片时,就会出现问题。因为有时候程序会卡住,导致它不响应,因为加载时间太长。我的问题是,怎样才能避免这种卡住的情况发生呢?我不知道怎么把wx.HtmlWindow的图片加载绑定到一个工作线程上,这样程序就可以在加载图片的同时继续运行,而不必等到图片加载完才能继续。

如果你需要我正在写的代码示例,请告诉我。

编辑:我还是没找到解决办法……因为这个问题,我在这个项目上几乎没有进展。我的应用需要能够动态加载消息和图片,而不会卡住,但我就是不知道怎么把图片加载放到另一个线程里,这样可以在加载图片的同时显示消息和图片的框架,并在加载完成后更新这些框架。这一切都需要在HtmlWindow中完成。我希望它在加载图片时能像真正的网页浏览器一样(你可以看到框架,图片慢慢出现)。

4 个回答

0

你可能想试试最新的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()

希望这能解决你的问题,告诉我你的情况。

0

除了Mike的回答(他说的都适用),你还可以通过重写HTMLWindow中的OnOpeningURL方法来处理图片加载的情况,并指定类型为wx.html.HTML_URL_IMAGE

你可以查看这些wx文档来了解更多解释。

0

如果你的程序中有一些需要很长时间才能完成的任务,它们会让程序的主循环停下来,这样就会导致程序“卡住”。为了避免这种情况,你应该把下载的过程放在一个单独的线程里,这样主程序就可以继续运行。当下载完成后,再更新你的界面。下面有几个链接,里面讲了如何使用线程(还有其他方法),可能会对你有帮助:

http://wiki.wxpython.org/LongRunningTasks

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

撰写回答