Python线程,一个接一个地加载一个线程

时间:2010-06-14 12:23:39

标签: python multithreading wxpython

我正在使用媒体播放器,并且可以加载一个.wav并播放它。如下面的代码所示。

  foo = wx.FileDialog(self, message="Open a .wav file...", defaultDir=os.getcwd(), defaultFile="", style=wx.FD_MULTIPLE)
  foo.ShowModal()

  queue = foo.GetPaths()

  self.playing_thread = threading.Thread(target=self.playFile, args=(queue[0], 'msg'))
  self.playing_thread.start()

但问题是,当我尝试将上述代码转换为多个.wav文件的循环时。这样,当playing_thread.isActive == True时,创建和.start()线程。然后,如果.isActive == False,则弹出队列[0]并加载下一个.wav文件。问题是,我的UI将锁定,我将不得不终止该程序。任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

由于使用wx.python,请使用Delayedresult,查看wx演示以获取完整示例。

完全最小的例子:

import wx
import wx.lib.delayedresult as inbg
import time

class Player(wx.Frame):
    def __init__(self):


    self.titulo = "Music Player"
    wx.Frame.__init__(self, None, -1, self.titulo,)
    self.jobID = 0
    self.Vb = wx.BoxSizer(wx.VERTICAL)
    self.panel = wx.Panel(self,-1)
    self.playlist = ['one','two']
    self.abortEvent = inbg.AbortEvent()
    self.msg = wx.StaticText(self.panel, -1, "...",pos=(30,-1))
    self.msg.SetFont(wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD))
    self.action = wx.Button(self.panel, -1,"Play Playlist")
    self.Bind(wx.EVT_BUTTON, self.StartPlaying,self.action)

    self.Vb.Add(self.msg, 0, wx.EXPAND|wx.ALL, 3)
    self.Vb.Add(self.action, 0, wx.EXPAND|wx.ALL, 3)
    self.panel.SetSizer(self.Vb)
    self.Show()


def StartPlaying(self,evt):
    self.BgProcess(self.Playme)


def Playme(self,jobID, abortEvent):
    print "in bg"
    list = self.getPlayList()
    print list
    for music in list:

        self.msg.SetLabel('Playing: %s' % music)
        stop = 100
        while stop > 0:
            print stop
            stop -=1
            self.msg.SetLabel('Playing: %s [%s ]' % (music,stop))






def _resultConsumer(self, inbg):
    jobID = inbg.getJobID()
    try:
        result = inbg.get()
        return result
    except Exception, exc:
        return False

def getPlayList(self):
    return self.playlist

def setPlayList(self,music):
    self.playlist.appdend(music)



def BgProcess(self,executar):
    self.abortEvent.clear()
    self.jobID += 1
    inbg.startWorker(self._resultConsumer, executar, wargs=(self.jobID,self.abortEvent), jobID=self.jobID)  



app  = wx.App(False)
demo = Player()
app.MainLoop()