在 PyQt5 中嵌入 Matplotlib:工具栏不起作用

Posted

技术标签:

【中文标题】在 PyQt5 中嵌入 Matplotlib:工具栏不起作用【英文标题】:Embedding Matplotlib in PyQt5: Toolbar doesn't work 【发布时间】:2017-07-08 18:25:31 【问题描述】:

我正在开发一个使用 matplotlib 和 pyqt5 进行图像处理的应用程序。这是一些代码:

class MainForm(QtWidgets.QMainWindow):

    def __init__(self):
        super(MainForm, self).__init__()
        uic.loadUi("...", self)

        self.setup_ui_elements()

        self.figure = Figure(figsize=(5, 4), dpi=100)

        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NaviToolbar(self.canvas, self)

        self.MiddleRightLayout.addWidget(self.toolbar)
        self.MiddleRightLayout.addWidget(self.canvas)

    def plot(self, img):
        self.figure.figimage(img)
        self.canvas.draw()

现在,如果我加载图像并将其绘制到画布上,则会出现两个问题:

    工具栏将显示,但没有效果(例如缩放、平移等) 我还没有找到使图像适合画布的方法,图像通常比画布区域大得多。

有什么想法吗?

你好,丹尼斯

【问题讨论】:

【参考方案1】:

figimage 直接放置在没有轴的画布上。这意味着它不会自动缩放到画布或其他任何东西,也意味着缩放和平移工具没有任何效果。

您可以使用 figimage 的 resize 参数,self.figure.figimage(img, resize=True) 让画布适合图像,如果这是您想要的。否则,您可能需要使用 imshow 绘图。

为了将图像缩放到其原始大小,您需要对间距进行一些调整。

import matplotlib.pyplot as plt
import numpy as np 


def plot(self, img):
    self.ax = self.figure.add_subplot(111)
    self.figure.subplots_adjust(.1,.1,.9,.9) # 10% margin around image
    h, w = np.array(img.shape[:2])/self.figure.dpi
    self.figure.set_size_inches(w/0.8,h/0.8)
    self.ax.imshow(img)
    self.ax.axis("off") # in case you want to turn the axes off
    self.canvas.draw()

【讨论】:

感谢您的回复,这正是我想要的,不需要轴,但如果显示它们也不会有太大问题。我将 resize-argument 设置为 True 但它仍然不起作用。也许另一个想法我做错了什么?问候,丹尼斯 什么不起作用? resize=True 使画布适合图像。你观察到不同的东西吗? 好的,抱歉,我误读了您的回复。如果我设置 resize=True,画布大小确实是图像的大小。所以这就是我想要做的:在图形窗口的中心显示图像,缩放到它的大小。并且工具栏应该可以工作。那么使用 imshow 会是更好的方法吗? 是的,如果您想要一个工作工具栏,请使用imshow。我更新了答案。 (但我无法测试) 有效!非常感谢你!编辑:必须注释掉第 3-5 行才能让它工作。我会寻找问题的。已将您的答案标记为正确,很遗憾无法为您投票。

以上是关于在 PyQt5 中嵌入 Matplotlib:工具栏不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当我在 PyQt5 窗口中嵌入 Matplotlib 图形时,为啥有两个重复的轴标签?

为啥我不能在 pyqt5 gui 中嵌入的 matplotlib 颜色图中成功绘制感兴趣区域?

无法在 pyqt5 中嵌入的 matplotlib 上绘制线条

将 Matplotlib 图形嵌入到小部件中 - PyQt5

Matplotlib 将图形嵌入到 UI PyQt5

PyQt5嵌入matplotlib-plot,改变x-ticks等属性[重复]