私は、PySide を使用した GUI プログラミングや、Python GUI 全般については初心者です。スレッドを使用して進行状況バーの値を設定しようとしていますが、機能せず、次のエラーが表示され続けます。
QPixmap: It is not safe to use pixmaps outside the GUI thread
また
QWidget::repaint: Recursive repaint detected
特にGUIで別のウィジェットとやり取りしようとすると、プログラムが突然クラッシュします。
以下は実際のコードではなく、私がやりたかったことの単なるシミュレーションです。
from PySide.QtGui import *
from PySide.QtCore import *
import os, time, platform, sys
class main(QDialog):
def __init__(self, parent = None):
super(main, self).__init__(parent)
self.resize(300, 100)
self.setMinimumSize(QSize(300, 100))
self.setMaximumSize(QSize(300, 100))
self.setWindowTitle("Test")
self.buttonStart = QPushButton("Start")
self.progressBar = QProgressBar()
self.gridLayout = QGridLayout(self)
self.setLayout(self.gridLayout)
self.gridLayout.addWidget(self.progressBar, 0, 0, 1, 1)
self.gridLayout.addWidget(self.buttonStart, 0, 1, 1, 1)
self.connect(self.buttonStart, SIGNAL("clicked()"), self.startProgress)
self.genericThread = GenericThread(self.test)
def startProgress(self):
self.genericThread.start()
def test(self):
print "started"
for i in range(100):
time.sleep(0.3)
print i
self.progressBar.setValue(i)
print "done"
class GenericThread(QThread):
def __init__(self, function, *args, **kwargs):
QThread.__init__(self)
self.function = function
self.args = args
self.kwargs = kwargs
def run(self):
self.function(*self.args,**self.kwargs)
return
app = QApplication(sys.argv)
start = main()
start.show()
app.exec_()
そのため、GenericThread は、関数ごとにスレッドを作成するのではなく、渡された関数をスレッドで実行することになっています。シグナルを使用して gui スレッドのウィジェットをスレッドに変更させる必要があることはわかっていますが、実際には、このスレッド クラスでそれを適用できませんでした。信号をテスト関数に追加してメインクラスに接続しようとしましたが、何もしませんでした。
それで、私は何をすべきですか?スレッド クラス GenericThread を変更したくありません。実際のコードには、個別のスレッドで実行する必要がある多くの関数があり、同時にスレッドの進行状況をユーザーに表示する必要があるためです。