我写了一个音乐下载和下载需要一段时间,图形用户界面冻结,而这发生了,那么我如何使它,使图形用户界面继续运行,而下载正在进行
以下是相关代码:
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)
我试图创建一个新的线程,但它没有帮助。有人能帮我吗
此代码中有两个错误:
Thread
的start()
方法才能执行target
target
应该是可调用的,但是执行以下操作:在创建
Thread
之前,您已经在调用函数,然后将返回值赋给target
。这是wy,你看到GUI冻结了。您必须使用lambda
:或
functools.partial
:这样,函数将在不同的线程中调用。
样式注释:您不必在创建
Thread
时指定None
:相关问题 更多 >
编程相关推荐