简体   繁体   中英

Python Threading, loading one thread after another

I'm working on a media player and am able to load in a single .wav and play it. As seen in the code below.

  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()

But the problem is, when I try to make the above code into a loop for multiple .wav files. Such that while playing_thread.isActive == True, create and .start() the thread. Then if .isActive == False, pop queue[0] and load the next .wav file. Problem is, my UI will lock up and I'll have to terminate the program. Any ideas would be appreciated.

Since is using wx.python, use a Delayedresult, look at wx demos for a complete example.

Full minimal example:

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()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM