PythonQt QRunnable GUI падает при работе потока
Я искал, чтобы внедрить QRunnable и QThreadPool в мое приложение Qt, где я хочу, чтобы GUI непрерывно слушал в фоновом режиме для микрофонного входа. У меня есть поток работает, и он работает, однако всякий раз, когда я пытаюсь взаимодействовать с графическим интерфейсом, программа вылетает.
import vtk, qt, ctk, slicer
from slicer.ScriptedLoadableModule import *
class Worker(qt.QRunnable):
def widget(self, m, r):
self.m = m
self.r = r
def run(self):
with self.m as source:
while True:
print("listening")
self.r.adjust_for_ambient_noise(source)
audio = self.r.listen(source)
try:
print(self.r.recognize_google(audio))
# handles any api/voice errors errors
except sr.RequestError:
print("There was an issue in handling the request, please try again")
except sr.UnknownValueError:
print("Unable to Recognize speech")
class VoiceRecognitionWidget(ScriptedLoadableModuleWidget):
def setup(self):
ScriptedLoadableModuleWidget.setup(self)
#Initializes recognizer and microphone
self.recognizer = sr.Recognizer()
try:
self.microphone = sr.Microphone()
except(IOError):
print("ERROR: No default microphone. Check if microphone is plugged in or if you have a default microphone set in your sound settings.")
self.errors.setText("ERROR: No default microphone. Check if your microphone is plugged in or if you have a default microphone set in your sound settings.")
parametersCollapsibleButton = ctk.ctkCollapsibleButton()
parametersCollapsibleButton.text = "Parameters"
self.layout.addWidget(parametersCollapsibleButton)
# Layout within the dummy collapsible button
parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton)
self.listenButton = qt.QPushButton("Begin Listneing")
self.listenButton.toolTip = "Listens for voice."
self.listenButton.enabled = True
parametersFormLayout.addRow(self.listenButton)
self.stopButton = qt.QPushButton("Stop Listensing")
self.stopButton.toolTip = "Stops listening."
self.stopButton.enabled = True
parametersFormLayout.addRow(self.stopButton)
self.repeatButton = qt.QPushButton("Repeat last command")
self.repeatButton.toolTip = "Listens for voice."
self.repeatButton.enabled = True
parametersFormLayout.addRow(self.repeatButton)
self.listenButton.connect('clicked(bool)', self.onListenButton)
self.stopButton.connect('clicked(bool)', self.onStopButton)
self.repeatButton.connect('clicked(bool)', self.onRepeatButton)
def onRepeatButton(self):
self.logic.parse("repeat")
def onStopButton(self):
self.stop_listening = True
def onListenButton(self):
slicer.util.delayDisplay("Wait...", 2450)
self.worker = Worker()
self.worker.widget(self.microphone, self.recognizer)
#self.worker.start() #Q Thread method
qt.QThreadPool.globalInstance().start(self.worker)
Цикл прослушивания работает. Это берет аудио, и это анализирует это хорошо. Просто когда я что-то делаю с GUI, даже если кнопка ничего не делает, программа просто падает. Также не отображаются ошибки. Любая помощь будет высоко ценится. Я пишу модуль Python для программы 3DSlicer, поэтому структура может выглядеть немного иначе.