将matplotlib嵌入到tkinter画布中会打开两个窗口

时间:2018-03-06 00:12:17

标签: python user-interface matplotlib canvas tkinter

以下我正在处理的代码没有按照我希望的方式运行。我已将matplotlib图形嵌入到tkinter画布中。该程序打开了两个窗口,其中一个功能正常,其中一个没有必要。我不知道如何解决这个问题。这是代码,请忽略不必要的导入:)

import numpy as np
import sys
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib as mpl
from matplotlib import cm
from numpy.random import random
from matplotlib.widgets import Button
import matplotlib.colors
import tkinter as tk
import matplotlib.backends.tkagg as tkagg
from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

DEBUG_MODE = False                          #Debug mode - True = ON
MATRIX_WIDTH = 50
MATRIX_HEIGHT = 50
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
LED_COUNT = MATRIX_WIDTH * MATRIX_HEIGHT
REFRESH_RATE = 30                           #REFRESH_RATE used to control FuncAnimation interval
MATRIX = random((50,50))                    #Fills MATRIX as not to be null for first print  


plt.rcParams['toolbar'] = 'None'            #Disables matplotlib toolbar
fig = plt.figure(figsize=(3,3))             #'figsize' measured in inches
im = plt.imshow(MATRIX, interpolation='nearest', cmap=cm.Spectral)
plt.axis('off')                             #Turns off x, y axis

def data_gen():                             #Generates amd populates MATRIX with pattern data
    while True:        
        MATRIX = random((MATRIX_WIDTH, MATRIX_HEIGHT))
        yield MATRIX
        if (DEBUG_MODE): print("MATRIX yeilded")

def update(data):                           #Updates/prints new MATRIX from data_gen()
    im.set_array(data)
    if (DEBUG_MODE): print("Updated data")



root = tk.Tk()
label = tk.Label(root,text="Matrix Program").grid(column=0, row=0)
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().grid(column=0,row=1)


ani = animation.FuncAnimation(fig, update, data_gen, interval=REFRESH_RATE)
plt.show()

需要对此代码执行哪些操作才能从tkinter打开一个画布,并嵌入实时matplotlib图形?

如何设置画布的大小?

1 个答案:

答案 0 :(得分:0)

如果要在tk GUI中显示您的图形,请不要调用plt.show()。在嵌入时,最好不要使用pyplot

另一方面,您可能希望在某个时刻启动主循环tk.mainloop()

请参阅matplotlib example有关如何将matplotlib图形嵌入到tk中的信息。