使用wxpython进行异步下载

时间:2011-07-03 23:20:10

标签: python wxpython urllib

好的,所以我的一个功能是打开一个url并读取其内容,然后将其写入文件中 问题是当我这样做我的UI冻结我知道我需要使用异步下载,但我似乎不太了解如何! 开放的网址约为10-20毫克 我会http://docs.python.org/library/threading.html以任何方式帮助我吗? 我的代码:

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

一个例子将非常感激

由于

4 个答案:

答案 0 :(得分:0)

您可以使用asynhttp客户端执行此操作,因为您无需阅读线程上的文档。

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

答案 1 :(得分:0)

这是一个例子。 10调用中的asyncDownload是以秒为单位的超时时间。你会想要增加它,或者可能完全摆脱它。下载结果存储在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')

答案 2 :(得分:0)

您需要获取给定的线程示例并将其组合到wxPython程序中。您可以在此站点上使用该示例,并基本上稍微修改它以使用新的线程示例:http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

答案 3 :(得分:0)

改编自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()