2017-07-08 102 views
0

我正在開發一個使用matplotlib和pyqt5進行圖像處理的應用程序。下面是一些代碼:在PyQt5中嵌入Matplotlib:工具欄不起作用

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. 我還沒有找到一種方法來適應圖像到畫布上,圖像通常比畫布區域大得多。

任何想法?

映入眼簾,丹尼斯

回答

0

figimage被直接放置在畫布上沒有軸。這意味着它不會自動縮放到畫布或其他任何東西,這也意味着縮放和平移工具沒有任何效果。

您可以使用resize參數figimage,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() 
+0

感謝您的回覆,這正是我想要的,軸是不需要的,但如果顯示它們也不會太大問題。我將resize-argument設置爲True,但它仍然不起作用。也許另一個想法我做錯了什麼?問候,丹尼斯 – ueezb

+0

*什麼*不起作用? 'resize = True'適合圖像的畫布。你觀察到不同的東西嗎? – ImportanceOfBeingErnest

+0

好吧,對不起,我誤解了你的回覆。如果我設置resize = True,畫布尺寸的確是圖像的大小。所以這就是我想要做的:在圖形窗口的中心顯示圖像,縮放到它的大小。而工具欄應該工作。所以使用imshow會是更好的方法嗎? – ueezb

相關問題