ボタンを使用して更新できるpyplotがあります。これはうまくいきます。しかし、pyplot を操作しようとすると (移動、ウィンドウのサイズ変更、ズームなど)、クラッシュします。
Fatal Python error: PyEval_RestoreThread: NULL tstate
日食が言うことです。
以下は、障害を再現するための最小限の実行例です。私はpython初心者なので、問題は私のコードにあると思います。
システム: Win7 64、Python 3.3.5、PyQt 5.2.1、Scipy スタック 14.4.1
# imports
import sys
from PyQt5.QtWidgets import (QApplication, QDialog, QCheckBox, QGridLayout, QPushButton)
import matplotlib.pyplot as plt
import numpy as np
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
# elements
self.hold = QCheckBox("Hold")
self.hold.setCheckable(True)
self.refreshButton = QPushButton("Refresh")
self.refreshButton.clicked.connect(self.refresh)
# layout
layout = QGridLayout()
layout.setColumnStretch(1, 0)
layout.setColumnMinimumWidth(1, 10)
layout.addWidget(self.hold, 1, 0)
layout.addWidget(self.refreshButton, 1, 1)
self.setLayout(layout)
# open window
plt.figure()
plt.ion()
plt.show()
self.refresh()
def refresh(self):
# delete plot if hold is checked
if not self.hold.isChecked():
plt.clf()
# random plot
plt.plot(np.random.normal(10, .1, 100))
plt.grid(True)
plt.draw()
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog = Dialog()
dialog.show()
sys.exit(app.exec_())
plt. show() の代わりに plt. draw() を使用しても、顕著な違いはありません。