Matplotlib - 情节不​​会出现

Matplotlib - plot wont show up

我想在按下按钮时绘制函数图(使用 matplotlib),为此我编写了以下代码:

##--IMPORT
#Tkinter
from tkinter import Tk, ttk
from tkinter import Frame, LabelFrame, Button
from tkinter import FALSE
#Numpy
from numpy import linspace
#Sympy
from sympy import symbols,sympify,diff,N,log
#MathPlotLib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

_x = symbols("x")
_sympyFunction = None
_SP_mainSubPlot = None

def pr_draw(plotToDrawTo):

    _sympyFunction = sympify("log(x) + x")
    valuesRange = linspace(0.01, 3, 100)

    x = []
    y = []

    #Calculate y and x values  
    for i in range(0, len(valuesRange)):
        tempValue = N(_sympyFunction.subs(_x,valuesRange[i]))

        x.append(float(valuesRange[i]))
        y.append(float(tempValue))

    #Draw function graph
    plotToDrawTo.plot(x,y)

##--MAIN
if __name__== "__main__":

    _root = Tk()
    _root.title("Grafico Approsimativo")
    _root.resizable(width = FALSE, height = FALSE)

    _mainFrame = Frame(_root, bg = "black")
    _mainFrame.pack(fill = "both", expand = True)


    #Frames
    #Main Left
    _F_LeftMainFrame = Frame(_mainFrame)
    _F_LeftMainFrame.grid(row = 0, column = 0, sticky = "nw")  

    _F_RightMainFrame = Frame(_mainFrame, bg = "violet")
    _F_RightMainFrame.grid(row = 0, column = 2, sticky = "ne")


    #Left Content--------------------------
    _B_calculate = Button(_F_LeftMainFrame, text = "Draw", command = lambda: pr_draw(_SP_mainSubPlot))
    _B_calculate.grid(row = 0, column = 0, padx = 5, pady = 5, sticky = "w")

    #Right Content--------------------------
    _F_mainPlotWindow = Figure(figsize = None, dpi = 100)

    _SP_mainSubPlot = _F_mainPlotWindow.add_subplot(111)
    _SP_mainSubPlot.grid(True)

    #HERE



    #Set master frame for Figure Obj
    canvas = FigureCanvasTkAgg(_F_mainPlotWindow, master = _F_RightMainFrame)
    canvas.get_tk_widget().pack()

这里的问题是,当按下按钮时,绘图中没有任何显示 window,我唯一能让它工作的方法是调用 pr_draw(_SP_mainSubPlot) 在我插入#HERE 行的位置:如果函数在那里被调用,它会工作,但不是从按钮。,为什么?

您需要在绘制后重新绘制 canvas。

添加行

plotToDrawTo.figure.canvas.draw_idle()

在你的 pr_draw 函数的末尾应该这样做。

请注意,我还必须在脚本末尾添加 _root.mainloop() 才能实际显示 window。