【问题标题】:Python Threading, loading one thread after anotherPython Threading,一个接一个地加载线程
【发布时间】:2010-06-14 12:23:38
【问题描述】:

我正在开发一个媒体播放器,并且能够加载单个 .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 文件的循环时。这样在play_thread.isActive == True 时,创建并 .start() 线程。然后如果 .isActive == False,弹出 queue[0] 并加载下一个 .wav 文件。问题是,我的 UI 将被锁定,我将不得不终止程序。任何想法将不胜感激。

【问题讨论】:

    标签: python multithreading wxpython


    【解决方案1】:

    由于使用的是wx.python,所以使用Delayedresult,查看wx demos以获得完整示例。

    完整的最小示例:

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

    【讨论】:

    • 谢谢,我试试看
    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多