如何在 pyqt 中使用嵌入式 matplotlib 重置/启动新多边形

How to reset/ start a new polygon with embeded matplotlib in pyqt

我正在尝试在我的 PySide2 应用程序中创建一个多边形选择器。选择器工作正常,但我想在按下退出按钮时向 reset/start 新多边形添加功能。类似于此 PolygonSelector 示例,当按下转义键时。

https://matplotlib.org/stable/gallery/widgets/polygon_selector_demo.html

我尝试了 .clear() 方法,但它似乎对我不起作用。

import sys

import numpy as np
from PySide2 import QtWidgets, QtGui

from matplotlib.backends.backend_qtagg import (
    FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure
from matplotlib.widgets import PolygonSelector

class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):

        super().__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)

        shortcut_clear_selection = QtWidgets.QShortcut(QtGui.QKeySequence("Escape"), self._main)
        shortcut_clear_selection.activated.connect(self.callback_clear_selection)

        layout = QtWidgets.QVBoxLayout(self._main)

        static_canvas = FigureCanvas(Figure(figsize=(5, 3)))
        layout.addWidget(NavigationToolbar(static_canvas, self))
        layout.addWidget(static_canvas)

        ax = static_canvas.figure.subplots()
        t = np.linspace(0, 10, 501)
        ax.plot(t, np.tan(t), ".")
        self.poly = PolygonSelector(ax, self.onselect)

    def onselect(self, verts):
        pass

    def callback_clear_selection(self):
        # HERE should be the reset part
        self.poly.clear()

if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)

    app = ApplicationWindow()
    app.show()
    app.activateWindow()
    app.raise_()
    qapp.exec_()

问题是,ESC 按键释放事件不是由 PolygonSelector 处理的,而是由您的回调处理的。因此,要清除多边形并重新开始创建多边形,您必须清除多边形数据并再次显示选择器。 clear 方法只是隐藏了选择器,但多边形数据保持不变。

将您的回调代码更改为:

def callback_clear_selection(self):
    # HERE should be the reset
    self.poly._xs, self.poly._ys = [0], [0]
    self.poly._selection_completed = False
    self.poly.set_visible(True)

现在,当您按下 ESC 时,应该会删除多边形,您可以开始选择新的多边形。