асинхронные загрузки с wxpython - PullRequest
0 голосов
/ 04 июля 2011

хорошо, поэтому одна из моих функций - открыть URL и прочитать его содержимое, а затем записать его в файл. проблема в том, что когда я это делаю, мой пользовательский интерфейс зависает, я знаю, что мне нужно использовать асинхронную загрузку, но я не понимаю, как именно! url im openining составляет около 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 голосов
/ 06 июля 2011

Адаптировано с 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()
0 голосов
/ 04 июля 2011

Вот пример.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')
0 голосов
/ 05 июля 2011

Вам нужно взять приведенный пример потоков и объединить его в программе wxPython. Вы можете использовать пример на этом сайте и слегка изменить его, чтобы использовать новый пример потоков: http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

0 голосов
/ 04 июля 2011

Для этого вы можете использовать клиент asynhttp, поскольку вам не нужно читать документы по многопоточности.

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

...