使用wxpython进行异步下载



好的,所以我的函数之一是打开一个url并读取其内容,然后将其写入文件问题是,当我冻结UI时,我知道我需要使用异步下载,但我似乎不太明白如何使用!打开时的url约为10-20mg也会http://docs.python.org/library/threading.html有什么办法帮我的吗?我的代码:

f = open("hello.txt",'wb')
datatowrite = urllib.urlopen(link).read()
f.write(datatowrite)
f.close()

就是一个很好的例子

感谢

您可以使用asynhttp客户端来完成此操作,因为您不必在线程中阅读文档。

http://code.google.com/p/asynhttp/

这里有一个例子。对asyncDownload的调用中的10是以秒为单位的超时周期。你会想要增加它,或者可能完全取消它。下载结果存储在thread.dataToWrite下。

import threading
import urllib2 as ul
class asyncDownload(threading.Thread):
   def __init__(self,url,http_timeout):
      threading.Thread.__init__(self)
      self.url = url
      self.http_timeout = http_timeout
   def run(self):
      self.dataToWrite = ul.urlopen(self.url,timeout=self.http_timeout).read()

url = 'http://www.yahoo.com'
thread = asyncDownload(url,10)
thread.run()
print('this thread is still running')

您需要采用给定的线程示例,并将其组合到wxPython程序中。你可以在这个网站上使用这个例子,基本上稍微修改一下,使用新的线程例子:http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

改编自http://wiki.wxpython.org/LongRunningTasks

import wx
import thread
class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        self.btn = wx.Button(self, label="Start")
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.btn, proportion=0, flag=wx.EXPAND)
        self.SetSizerAndFit(sizer)
        self.Bind(wx.EVT_BUTTON, self.onButton)
    def onButton(self, evt):
        self.btn.Enable(False)
        thread.start_new_thread(self.longRunning, ())
    def onLongRunDone(self):
        print "finished my task, I may want to update GUI elements here"
        self.btn.Enable(True)
    def longRunning(self):
        f = open("hello.txt",'wb')
        datatowrite = urllib.urlopen(link).read()
        f.write(datatowrite)
        f.close()
        wx.CallAfter(self.onLongRunDone)
if __name__ == "__main__":
    app = wx.PySimpleApp()
    app.TopWindow = MainFrame(None)
    app.TopWindow.Show()
    app.MainLoop()

相关内容

  • 没有找到相关文章

最新更新