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

时间:2017-07-08 18:25:32

标签: python matplotlib pyqt5

我正在使用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. 将显示工具栏,但它没有效果(例如缩放,平移等)
  2. 我还没有找到一种方法让图像适合画布,图像通常比画布区域大得多。
  3. 有什么想法吗?

    迎接,丹尼斯

1 个答案:

答案 0 :(得分:0)

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()