如何在 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
时,应该会删除多边形,您可以开始选择新的多边形。
我正在尝试在我的 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
时,应该会删除多边形,您可以开始选择新的多边形。