2017-01-19 14 views
2

これはシンプルなマンガリーダです。メインウィンドウをフリーズせずにイメージを読み込もうとしていますが、スレッドでこれをしようとしましたが、メインウィンドウ、何が間違っていますか?また、私は感謝を知りたい別の方法がある場合は、私はPythonに新しいです。他のスレッドからguiにラベルを送るにはどうすればいいですか? - PyQt

from PyQt5 import QtCore, QtGui, QtWidgets 
import os 

class MainWin(QtWidgets.QMainWindow): 

    ... 

    def add_widget(self, data): 
     self.verticalLayout.addWidget(data) 

    def file_open(self): 
     adres = QtWidgets.QFileDialog.getExistingDirectory() 
     self.loader = LoaderThread(adres) 
     self.loader.start() 
     self.loader.pics.connect(self.add_widget) 


class LoaderThread(QtCore.QThread): 

    pics = QtCore.pyqtSignal(object) 

    def __init__(self, nAdres): 
     QtCore.QThread.__init__(self) 
     self.adres = nAdres 

    def run(self): 
     liste = os.listdir(self.adres) 
     order = 0 
     for i in liste: 
      label = QtWidgets.QLabel() 
      pixmap = QtGui.QPixmap(self.adres + '/' + liste[order]) 
      label.setPixmap(pixmap) 
      self.pics.emit(label) 
      order += 1 

if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    win = MainWin() 
    win.show() 
    sys.exit(app.exec_()) 
+0

関連:http://stackoverflow.com/questions/28925473/qpixmap-not-safe-outside-gui- thread関連して、セカンダリスレッドからのGUIオブジェクト( 'QLabel'など)を使用することはできません。リンクのアドバイスを考えて、スレッド間に 'QImage'を使い、メインスレッドで' QLabel'を構築してください。 –

答えて

1

GUIスレッドの外部にウィジェットまたはピックスマップを作成することはできません。だからワーカースレッドでQImageを作成し、スロットにラベルやピックスマップを作成します。

class LoaderThread(QtCore.QThread): 
    ... 
    def run(self): 
     liste = os.listdir(self.adres) 
     order = 0 
     for i in liste: 
      image = QtGui.QImage(self.adres + '/' + liste[order]) 
      self.pics.emit(image) 
      order += 1 


class MainWin(QtWidgets.QMainWindow): 
    ... 
    def add_widget(self, image): 
     label = QtWidgets.QLabel() 
     label.setPixmap(QtGui.QPixmap.fromImage(image)) 
     self.verticalLayout.addWidget(label) 
関連する問題