在 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 上绘制线条