2017-04-18 417 views
1

我在另一個繪製圖形的腳本中有一個函數,所以圖形已經預先繪製好,我只是想將它放到我的PyQt5界面上的一個小部件中。我輸入了它,當它運行時,它會打開兩個窗口,一個窗口在圖形中,一個在用戶界面中。任何想法?Matplotlib將圖形嵌入到用戶界面中PyQt5

下面是代碼:

def minionRatioGraph(recentMinionRatioAvg): 
    x = recentMinionRatioAvg 
    a = x*10 
    b = 100-a 
    sizes = [a, b] 
    colors = ['#0047ab', 'lightcoral'] 
    plt.pie(sizes, colors=colors) 

    #determine score colour as scolour 
    if x < 5: 
     scolour = "#ff6961" #red 
    elif 5 <= x < 5.5: 
     scolour = "#ffb347" #orange 
    elif 5.5 <= x < 6.5: 
     scolour = "#77dd77" #light green 
    elif 6.5 <= x: 
     scolour = "#03c03c" # dark green 

    #draw a circle at the center of pie to make it look like a donut 
    centre_circle = plt.Circle((0,0),0.75, fc=scolour,linewidth=1.25) 
    fig = plt.gcf() 
    fig.gca().add_artist(centre_circle) 

    # Set aspect ratio to be equal so that pie is drawn as a circle. 
    plt.axis('equal') 
    plt.show() 

這是一個腳本。在我的GUI腳本,我已經導入這些:

from PyQt5 import QtCore, QtGui, QtWidgets 
import sqlite3 
import matplotlib.pyplot as plt 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as 
FigureCanvas 
from graphSetup import * 

而在我的窗口類的開始,設置功能之前,我有這樣的功能:

def minionGraphSetup(self, recentMinionRatioAvg): 
    minionRatioGraph(recentMinionRatioAvg) 

回答

0

而不是調用plt.show的需要將導入的腳本生成的圖放入PyQt GUI的FigureCanvas中。

在繪製腳本

所以做

def minionRatioGraph(recentMinionRatioAvg): 
    ... 
    fig = plt.gcf() 
    fig.gca().add_artist(centre_circle) 
    plt.axis('equal') 
    #plt.show() <- don't show window! 
    return fig 

在你的GUI腳本中使用獲得的圖形將其放置到畫布上。

def minionGraphSetup(self, recentMinionRatioAvg): 
    fig = minionRatioGraph(recentMinionRatioAvg) 
    ... 
    self.canvas = FigureCanvas(fig, ...) 


如果你想返回一個圖片,你可以將它保存到一個字節緩衝區,

import io 
def minionRatioGraph(recentMinionRatioAvg): 
    ... 
    fig = plt.gcf() 
    fig.gca().add_artist(centre_circle) 
    plt.axis('equal') 
    buff = io.BytesIO() 
    plt.savefig(buff, format="png") 
    return buff 

,然後顯示它在PyQt的GUI圖像。 (我沒有測試下面,所以它可能有點不同。)

def minionGraphSetup(self, recentMinionRatioAvg): 
    image = minionRatioGraph(recentMinionRatioAvg) 
    label = QLabel() 
    pixmap = QPixmap(image) 
    label.setPixmap(pixmap) 
+0

雖然這個工程,這不是我所尋找的,而不是你的錯,我的。你知道我怎麼可能將圖形直接導出爲gui圖像?我知道你可以將圖形保存爲圖像,但是如何將更新後的圖像放在屏幕上,據我所知,當編譯資源文件時,所有圖像保持不變,我不知道如何重新加載它。 –

+0

我更新了圖像的答案。我目前無法進行測試,所以請將其作爲路線圖作爲工作代碼。 – ImportanceOfBeingErnest

+0

代碼停止在'pixmap = QPixmap(image)'工作,我不確定爲什麼?有什麼想法嗎?另外,我將如何將它放入我的窗戶?我會傳遞窗口的名稱並將self.centralwidget放入QLabel括號中嗎?謝謝 –