matplotlib 그림이있는 Qslitter를 가장자리로 이동할 때 PyQt5가 충돌하지 않도록하려면 어떻게해야합니까?

ymmx

QSplitter 안에 두 개의 matplotlib 그림이 있습니다. Splitter를 가장자리로 이동하면 (그림이 사라짐) 코드가 충돌합니다.

여기에 이미지 설명 입력

내가 얻는 오류는

Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\matplotlib\backends\backend_qt5.py", line 397, in resizeEvent
    self.figure.set_size_inches(winch, hinch, forward=False)
  File "C:\Python36\lib\site-packages\matplotlib\figure.py", line 902, in set_size_inches
    raise ValueError(f'figure size must be positive finite not {size}')
ValueError: figure size must be positive finite not [0.   6.12]

Qsplitter의 양면 중 하나만 화면에 표시 될 때 이전에는 문제가되지 않았습니다. 내 코드가 충돌하지 않았습니다. 스플리터를 다시 중앙으로 당기면 그림이 제대로 다시 나타납니다.

여기에 최소한의 예가 있습니다.

from PyQt5.QtGui import *
from PyQt5.QtWidgets import  *
from PyQt5.QtCore import * 
import sys
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

class window(QMainWindow):
    def __init__(self, parent=None):
        super(window, self).__init__()
        self.parent = parent

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.mainHBOX_param_scene = QHBoxLayout()

        self.mainsplitter = QSplitter(Qt.Horizontal)
        V1 = Viewer()
        V2 = Viewer()
        self.mainsplitter.addWidget(V1)
        self.mainsplitter.addWidget(V2)


        self.mainHBOX_param_scene.addWidget(self.mainsplitter)
        self.centralWidget.setLayout(self.mainHBOX_param_scene)


class Viewer(QGraphicsView):
    def __init__(self, parent=None):
        super( Viewer, self).__init__(parent)
        self.parent = parent
        self.setStyleSheet("border: 0px")
        self.scene = QGraphicsScene(self)
        self.setScene(self.scene)
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)

        self.axes_Delay = self.figure.add_subplot(1, 1,1)
        self.axes_Delay.set_title("Title")

        # self.canvas.setGeometry(0, 0, 1600, 500 )
        layout = QVBoxLayout()
        layout.addWidget(self.canvas)
        self.setLayout(layout)
        self.canvas.show()


    def closeEvent(self, event):
        plt.close(self.figure)


def main():
    app = QApplication(sys.argv)
    ex = window(app)
    ex.show()
    sys.exit(app.exec_( ))


if __name__ == '__main__':
    main()

이 오류를 어떻게 피할 수 있습니까? 그런데 matplotlib 버전 3.2.1을 사용합니다.

Eyllanesc

분명히 resizeEvent의 크기가 <= 0 일 수 있다고 생각하지 않은 matplotlib 버그이며, 해당 정보는 이러한 유형의 오류를 일으키는 관련 Figure를 통해 페인트하는 데 사용됩니다. 해결책은 resizeEvent 메서드를 재정의하는 것입니다.

class FixFigureCanvas(FigureCanvas):
    def resizeEvent(self, event):
        if event.size().width() <= 0 or event.size().height() <= 0:
            return
        super(FixFigureCanvas, self).resizeEvent(event)
# ...
self.figure = plt.figure()
self.canvas = FixFigureCanvas(self.figure)

self.axes_Delay = self.figure.add_subplot(1, 1, 1)
# ...

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관