픽스맵을로드하는 코드를 래핑하는 QThreadPool
및 일부 QRunnable
을 사용하여이를 수행 할 수 있어야합니다. 다음과 같이하십시오 :
from PyQt5 import QtCore, QtGui
class PixmapLoader(QtCore.QRunnable):
def __init__(self, filename):
super().__init__()
self.filename = filename
def run(self):
# Load pixmap at filename
# ...
# then emit in a signal
loaded.emit(pixmap)
loaded = QtCore.pyqtSignal(QtGui.QPixmap)
그런 다음 주 응용 프로그램의 어딘가에 스레드 풀을 만들고로드 객체를 실행하고 신호를 처리하십시오.
pool = QtCore.QThreadPool()
loaders = [PixmapLoader(filename) for filename in filenames]
for loader in loaders:
loader.loaded.connect(handle_new_pixmap)
pool.start(loader)
def handle_new_pixmap(QtGui.QPixmap):
# do stuff with pixmap
는 나는이을 시도하지했지만, Qt는이 스레드를 처리하기 때문에, 이것은 잘 여러 개의 스레드를 활용할 수 있어야합니다.
바와 같이 코멘트 설명 편집이 작동하지 않습니다. QRunnable
은 QObject
을 상속하지 않으며, QPixmaps
은 기본 스레드 외부에서 생성 할 수 없다는 사실을 잊어 버렸습니다. 그러나 대신에 이미지 로더 객체를 사용하고 하나 이상의 배경 스레드로 이동하여 QImage
을로드 한 다음 나중에 사용할 수 있도록 기본 스레드로 전송합니다. 현재 디렉토리에서 모든 PNG 파일을로드하여 베어 본을 수행 할 테스트 된 코드입니다.
#!/usr/bin/env python3
import os
from PyQt5.QtCore import pyqtSignal, QObject, QThread
from PyQt5.QtGui import QImage
from PyQt5.QtWidgets import QApplication
class ImageLoader(QObject):
loaded = pyqtSignal(str, QImage)
def __init__(self, filename):
super().__init__()
self.filename = filename
def on_load_signal(self):
img = QImage(self.filename)
self.loaded.emit(self.filename, img)
class LoaderManager(QObject):
request_img_load = pyqtSignal()
def __init__(self):
super().__init__()
self.loaders = list(map(ImageLoader,
filter(lambda f: f.endswith('.png'), os.listdir())))
self.bg_thread = QThread()
for loader in self.loaders:
self.request_img_load.connect(loader.on_load_signal)
loader.loaded.connect(self.handle_img_loaded)
loader.moveToThread(self.bg_thread)
self.bg_thread.start()
def __del__(self):
self.bg_thread.quit()
def load_all(self):
self.request_img_load.emit()
def handle_img_loaded(self, name, img):
print('File {} of size {} loaded'.format(name, img.byteCount()))
if __name__ == '__main__':
app = QApplication([])
manager = LoaderManager()
manager.load_all()
감사합니다. @bnaecker! 최대한 빨리 시도해 보겠습니다 –
이 코드는 작동하지 않습니다. Qt는 주 스레드 외부에서 픽스맵을 만드는 것을 지원하지 않으므로, 대신에'QImage'를 사용해야합니다. 또한,'QRunnable'은'QObject'를 상속받지 않으므로 신호를 낼 수 없습니다. 'QThread'를 사용해야합니다. – ekhumoro
@ekhumoro 지적 해 주셔서 고맙습니다. 저는 답변을 업데이트했습니다. – bnaecker