线程化GUI

2024-04-19 23:15:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个音乐下载和下载需要一段时间,图形用户界面冻结,而这发生了,那么我如何使它,使图形用户界面继续运行,而下载正在进行

以下是相关代码:

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)

我试图创建一个新的线程,但它没有帮助。有人能帮我吗


Tags: textselfconvertdownloaddefcountrangewx
1条回答
网友
1楼 · 发布于 2024-04-19 23:15:51

此代码中有两个错误:

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。这是wy,你看到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()

相关问题 更多 >