2013-10-02 4 views
0

Im написание музыки загрузчика и загрузка занимает некоторое время, и графический интерфейс замерзает в то время как это происходит так, как я могу сделать это так, что графический интерфейс продолжает работать во время загрузки будетМногопоточность графического интерфейса

Вот соответствующий код:

class GUI(wx.Frame): 
    def __init__(self, parent, id, title): 

     self.retreive_range = 10 
     self.convert_range = 10 
     self.download_range = 100 

     self.timer1 = wx.Timer(self, 1) 
     self.timer2 = wx.Timer(self, 1) 
     self.timer3 = wx.Timer(self, 1) 

     self.count = 0 
     self.count2 = 0 
     self.count3 = 0 

     self.getfile = Get_file() 

     self.Bind(wx.EVT_TIMER, self.OnTimer1, self.timer1) 

     #All the GUI code! 


    def retrieve(self, e): 
     self.timer1.Start(100) 
     self.text.SetLabel('Retrieving URL...') 
     query = self.tc.GetValue() 
     self.vidurl = self.getfile.get_url(query) 



    def convert(self): 
     self.timer2.Start(200) 
     self.text.SetLabel('Converting...') 
     self.res_html = self.getfile.get_file('http://www.youtube.com/%s'%self.vidurl) 
     print self.res_html 

    def download(self): 
     self.text.SetLabel('Downloading...') 
     threading.Thread(None, target=self.getfile.download_file(self.res_html)) 



    def OnTimer1(self, e): 

     self.count = self.count + 1 
     self.gauge.SetValue(self.count) 

     if self.count == self.retreive_range: 

      self.timer1.Stop() 
      self.text.SetLabel('Url Retreived!') 
      self.Bind(wx.EVT_TIMER, self.OnTimer2, self.timer2) 
      self.convert() 

    def OnTimer2(self, e): 

     self.count2 = self.count2 + 1 
     self.gauge.SetValue(self.count2) 

     print self.count2 

     if self.count2 == self.convert_range: 

      self.timer2.Stop() 
      self.text.SetLabel('Converted!') 
      self.Bind(wx.EVT_TIMER, self.OnTimer3, self.timer3) 
      self.download() 

    def OnTimer3(self, e): 

     self.count3 = self.count3 + 0.5 
     self.gauge.SetValue(self.count3) 

     if self.count3 == self.download_range: 

      self.timer3.Stop() 
      self.text.SetLabel('Downloaded!') 
      self.gauge.SetValue(0) 

Я пытаюсь создать новую тему, но это не поможет. может кто-нибудь помочь мне

ответ

0

В этом коде есть две ошибки:

def download(self): 
    self.text.SetLabel('Downloading...') 
    threading.Thread(None, target=self.getfile.download_file(self.res_html)) 
  1. Вы должны вызвать start() метод Thread для того, чтобы выполнить команду target
  2. target должен быть a , подлежащий вызову, но:

    target=self.getfile.download_file(self.res_html) 
    

    Вы уже вызываете функцию до Thread, а затем возвращаемое значение присвоено target. Это означает, что вы видите, как затухает GUI. Вы должны использовать lambda:

    target=lambda: self.getfile.download_file(self.res_html) 
    

    Или functools.partial:

    target=partial(self.getfile.download_file, self.res_html) 
    

    В этом случае функция будет вызываться в другом потоке.


Стиль Примечание: вы не должны указать None при создании Thread:

worker = threading.Thread(target=lambda: self.getfile.download_file(self.res_html)) 
worker.start() 
+0

Ok я вижу! это так сильно помогло! – Serial

Смежные вопросы