2013-10-02 91 views
0

我写音乐下载,下载需要一段时间和GUI冻结而发生这种情况,所以我怎样才能让这个图形用户界面保持在下载会线程一个GUI

下面是相关的代码运行:

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. 必须调用Threadstart()方法,以便其执行target
  2. target应一个可调用,但是这样做:

    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) 
    

    这样的功能会在不同的线程调用。


样式注意:您有创建Thread时指定None

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

好吧,我看看!它的工作非常感谢! – Serial