PyQt4 - 运行在单独的线程

时间:2016-08-21 03:36:03

标签: python multithreading user-interface pyqt4 qthread

我正在大学申请毕业论文,我仍然坚持使用线程。 我试图制作一个音频播放器,将文件加载到一个表中并在考虑指定的时间间隔时播放它们(基本上在播放每个声音后休眠)。我可以让列表按顺序播放,但它在同一个线程中,因此GUI会在发生这种情况时受到攻击。我使用PyQt4作为GUI,因为它是制作GUI的最快方式,而且我有视力障碍,所以我不想浪费时间编写所有UI内容。 我已经看到了一些QThread示例,但我似乎无法让我的线程工作。 我使用winsound播放声音,它们从内部列表加载,该列表与GUI上显示的表格相对应 file_list是一个Ui_MainWindow实例变量(基本上是主应用程序类的变量),所有函数也在该类中定义 这是相关代码:

import sys
from PyQt4 import QtGui, QtCore
from winsound import PlaySound, SND_FILENAME

#some用于Ui_MainWindow类的更多代码

  def play_stop(self):
      t=Create_thread(self.snd_play)        t.started.connect(func)
      t.start()


  def snd_play(self):
      if not self.is_playing:
          self.is_playing=True
          for e in self.file_list:
              PlaySound(e, SND_FILENAME)
          self.is_playing=False

class Create_thread(QtCore.QThread):

  def __init__(self,function):
      QtCore.QThread.__init__(self)
      self.function=function

def run(self):
    self.function()

  def main():
    app=QtGui.QApplication([])
    window=Ui_MainWindow()
    window.setupUi(window)
    window.show()
    sys.exit(app.exec_())

我创建了一个Create_thread类,因为我想要一个快速的方法在不同的线程中运行函数,这就是run函数执行作为参数给出的函数的原因

当我在没有GUI和线程模块的情况下进行测试时这很有效但是当我介绍GUI时它停止了工作并且崩溃了我的程序 就像我说的那样,play_stop和snd_play是Ui_Mainwindow类的功能 任何帮助都将非常感激,因为没有线程我的应用程序将无法正常工作。

1 个答案:

答案 0 :(得分:1)

我发现了线程模块的问题(当然是我的错) 对于任何有类似问题的人来说,这里有正确的班级代码:

    class Create_thread(threading.Thread):
        def __init__(self,function):
            threading.Thread.__init__(self)
            self.function=function
        def run(self):
            self.function()

所以我只需要调用Thread类的 init 函数。 这里还有play_stop功能代码:

    def play_stop(self):
        t=Create_thread(self.snd_play) #calls the actual function to play
        t.start()

@ 101感谢您的回复