Всем привет!
Люди, пожалуйста, помогите разобраться с multiprocessing в pyqt. Хочу изменить картинку на QLabel через дочерний процесс. Такой код:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from multiprocessing import Process, Pool
class Test(QWidget):
def __init__(self):
super().__init__()
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.label = QLabel()
self.layout.addWidget(self.label)
self.pixmap = QPixmap()
def set_pixmap(classname=None):
classname.pixmap.load('test.jpg')
classname.label.setPixmap(classname.pixmap)
if __name__ == '__main__':
app = QApplication(sys.argv)
test = Test()
test.show()
proc = Process(target=set_pixmap, kwargs={'classname': test})
proc.start()
proc.join()
# pool = Pool()
# pool.map(set_pixmap, (test,))
# pool.close()
# pool.join()
sys.exit(app.exec_())
В таком виде картинка не появляется. Если через pool запускать, то валятся ошибки:
Process ForkPoolWorker-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/process.py", line 254, in _bootstrap
self.run()
File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3.5/multiprocessing/pool.py", line 108, in worker
task = get()
File "/usr/lib/python3.5/multiprocessing/queues.py", line 345, in get
return ForkingPickler.loads(res)
RuntimeError: super-class __init__() of type Test was never called
Читал, что виджеты в pyqt должны быть созданы в главном потоке: у меня так и есть, вроде, у виджета только свойство меняю. Можно ли дочерним процессом установить QPixmap?