好的,所以我的函数之一是打开一个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()