在PyQt中禁用matplotlib小部件

时间:2017-11-17 10:15:53

标签: python matplotlib canvas pyqt figure

我有一个带有几个嵌入式matplotlib小部件(https://github.com/chipmuenk/pyFDA)的pyQt应用程序。

可以为每个绘图小部件关闭绘图的自动更新以加速应用程序(特别是3D绘图可能需要很长时间)。

不幸的是,我还没有完全禁用(灰色)画布。我喜欢的是做

之类的事情
class MplWidget(QWidget):
    """
    Construct a subwidget with Matplotlib canvas and NavigationToolbar
    """

    def __init__(self, parent):
        super(MplWidget, self).__init__(parent)
        # Create the mpl figure and construct the canvas with the figure
        self.fig = Figure()
        self.pltCanv = FigureCanvas(self.fig)
#-------------------------------------------------

self.mplwidget = MplWidget(self)
self.mplwidget.pltCanv.setEnabled(False) # <- this doesn't work

明确表示此窗口小部件中没有任何内容可以与之交互。有一个简单的解决方法吗?

1 个答案:

答案 0 :(得分:1)

灰色图。

您可以通过在其上面放置一个灰色的半透明贴片来使图形变灰。为此,您可以创建一个Rectangle,将其zorder设置得非常高并为其赋予图形变换。要将其添加到轴,您可以使用ax.add_patch;但是,为了将其添加到带有3D轴的图形中,这将无法工作,您需要通过fig.patches.extend添加它。 (见this answer

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot([1,3,2],[1,2,3],[2,3,2])

rect=plt.Rectangle((0,0),1,1, transform=fig.transFigure, 
                   clip_on=False, zorder=100, alpha=0.5, color="grey")
fig.patches.extend([rect])

plt.show()

enter image description here

断开所有活动

您可以断开画布中的所有事件。这将阻止任何用户交互,但也不可逆转;因此,如果您在稍后阶段需要这些事件,解决方案会更复杂。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot([1,3,2],[1,2,3],[2,3,2])

for evt, callback in fig.canvas.callbacks.callbacks.items():
    for cid, _ in callback.items():
        fig.canvas.mpl_disconnect(cid)
plt.show()