PyQt4 - Запуск функций, использующих встроенные модули python 2.7.11 в отдельных потоках.

Я подаю заявку на выпускную работу в университете, и я застрял с потоками. Я пытаюсь создать аудиоплеер, который загружает файлы в таблицу и воспроизводит их, принимая во внимание указанные интервалы (в основном, спит после каждого воспроизводимого звука). Я могу получить список для воспроизведения по порядку, но он находится в том же потоке, поэтому графический интерфейс получает stcuk, пока это происходит. Я использовал PyQt4 для графического интерфейса, потому что это был самый быстрый способ создания графического интерфейса, и у меня слабое зрение, поэтому я не хочу тратить время на кодирование всего пользовательского интерфейса. Я видел несколько примеров QThread, но, похоже, мне не удается заставить мою многопоточность работать. Я использую winsound для воспроизведения звуков, и они загружаются из внутреннего списка, который соответствует таблице, отображаемой в графическом интерфейсе, file_list - это переменная экземпляра Ui_MainWindow (в основном переменная основного класса приложения), и все функции также определены в этом class Вот соответствующий код:

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

# еще код для класса 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, потому что мне нужен был быстрый способ запуска функций в отдельных потоках, поэтому функция запуска выполняет функцию, указанную в качестве аргумента.

это работало, когда я тестировал без графического интерфейса и с модулем потоковой передачи, но когда я представил графический интерфейс, он перестал работать и разбил мою программу, как я сказал, что play_stop и snd_play являются функциями класса Ui_Mainwindow. Любая помощь будет принята с благодарностью, потому что без потоковой обработки мое приложение не будет работать должным образом.


person bthe1    schedule 21.08.2016    source источник
comment
Вы все еще можете использовать обычный модуль threading с PyQt, и в вашем случае я бы сказал, что это проще.   -  person all or None    schedule 21.08.2016
comment
Класс Create_thread на самом деле использовался для наследования от threading.Thread, но, как и в случае с QThread, не работал.   -  person bthe1    schedule 21.08.2016


Ответы (1)


Я обнаружил проблему с модулем потоковой передачи (конечно, это была моя ошибка). Для тех, у кого есть подобные проблемы, вот правильный код класса:

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

поэтому мне просто нужно было вызвать функцию init класса Thread. также вот код функции play_stop:

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

@ 101 спасибо за ответ

person bthe1    schedule 21.08.2016